You are here

Add new comment

Error message

The spam filter installed on this site is currently unavailable. Per site policy, we are unable to accept new submissions until that problem is resolved. Please try resubmitting the form in a couple of minutes.

Ř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]

Plain text

  • No HTML tags allowed.
  • Lines and paragraphs break automatically.