Подтвердить что ты не робот

Лингвистическая сортировка (немецкий) с Java

Сортировка строки с номером выполняется иначе, чем один язык. Например, на английском языке цифры идут до букв в восходящей сортировке. Но, по-немецки, цифры восходящие сортируются по буквам.

Я попытался отсортировать строки с помощью Collator следующим образом:

private Collator collator = Collator.getInstance(Locale.GERMANY);
collator.compare(str1, str2)

Но выше сравнение не учитывает цифры после правильности букв.

Есть ли у кого-нибудь идея, почему Java не принимает это правило (цифры после буквы), пока я использую RuleBasedCollator следующим образом:

private final String sortOrder = "< a, A < b, B < c, C < d, D < e, E < f, F < g, G < h, H < i, I < j, J < k, K < l, L < m, M < n, N < o, O < p, P < q, Q < r, R < s, S < t, T < u, U < v, V < w, W < x, X < y, Y < z, Z < 0 < 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9";

private Collator collator = new RuleBasedCollator(sortOrder);
4b9b3361

Ответ 1

Вы можете проверить/отладить исходный код, чтобы узнать, почему ничего не меняется:

Collator.getInstance(Locale.GERMANY);

Вызывает следующий код:

public static synchronized
Collator getInstance(Locale desiredLocale)
{
    // Snipping some code here
    String colString = "";
    try {
        ResourceBundle resource = LocaleData.getCollationData(desiredLocale);

        colString = resource.getString("Rule");
    } catch (MissingResourceException e) {
        // Use default values
    }
    try
    {
        result = new RuleBasedCollator( CollationRules.DEFAULTRULES +
                                        colString,
                                        CANONICAL_DECOMPOSITION );
    }
// Snipping some more code here

Здесь вы можете видеть, что определенные правила (colString, которые пусты в вашем случае в любом случае) помещаются после значений по умолчанию (CollationRules.DEFAULTRULES).

И поскольку вы обнаружили, что значения по умолчанию имеют первые значения:

  // NUMERICS

    + "<0<1<2<3<4<5<6<7<8<9"
    + "<\u00bc<\u00bd<\u00be"   // 1/4,1/2,3/4 fractions

    // NON-IGNORABLES
    + "<a,A"
    + "<b,B"
    + "<c,C"
    + "<d,D"