You are here

Řazení textů v jazyku Java

Defaultní pravidla pro řazení stringů v Javě ignorují mezery (whitespaces). To je nepříjemné, protože například pravidla řazení pro češtinu s mezerou pracují. Třída RuleBaseCollator používá CollationRules.DEFAULTRULES (SUN specific) a připojí pravidla pro místní řazení na konec. Defaultní pravidla řadí mezeru až v druhém pořadí. Možnosti řešení:

  • přidat na konec nové pravidlo pro mezeru "& ' ' , ovšem je zde nutné uvést všechny znaky, které mají být větší než mezera
  • změnit CollationRules.DEFAULTRULES - přidat pravidlo pro mezeru před pravidlo pro '_'

Poznámka: kód je pouze příklad, jak řešit problém, neobsahuje všechna čská pravidla pro řazení.

Locale locale = new Locale("cs");
RuleBasedCollator defaultCollator = (RuleBasedCollator) Collator.getInstance(locale);

final String rules = defaultCollator.getRules();
// due to unicode this is not fully legible string
System.out.println("rules: " + rules);

// correct sorting, but all characters must be explicitly specified,
// this sample
// only specifies that y and z are after space, other characters will be
// before space
RuleBasedCollator collator1 = new RuleBasedCollator(rules + "& ' ' < x,z");

// add rule for space before '_'
RuleBasedCollator collator2 = new RuleBasedCollator(rules.replaceAll(
		"<'\u005f'", "<' '<'\u005f'"));

String[] testStr = { "ja", "j p", "j z" };

String[] test = testStr.clone();
Arrays.sort(test, defaultCollator);
System.out.println("default sorting: " + Arrays.toString(testStr));

test = testStr.clone();
Arrays.sort(test, collator1);
System.out.println("partially correct: " + Arrays.toString(test));

test = testStr.clone();
Arrays.sort(test, collator2);
System.out.println("should be correct: " + Arrays.toString(test));

Výstup na JDK 6.0:

rules: (pravidla včetně unicode smetí)

Defaultní chybní řazení, mezera je až za 'a':

default sorting: [ja, j p, j z]

První řešení s dvěmi znaky, takže nutnost přidat všechny je více zřetelná:

partially correct: [j z, ja, j p]

Správné řešení se změněnými defaultními pravidly:

should be correct: [j p, j z, ja]