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]