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í:
"& ' ' , ovšem je zde nutné uvést všechny znaky, které mají být větší než mezera
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]