Spec-Zone .ru
спецификации, руководства, описания, API
|
Предыдущий раздел, обсужденный, как использовать предопределенные правила для локали, чтобы сравнить строки. Эти правила сопоставления определяют порядок сортировки строк. Если предопределенные правила сопоставления не удовлетворяют Ваши потребности, можно разработать свои собственные правила и присвоить их a RuleBasedCollator
объект.
Специализированные правила сопоставления содержатся в a String
объект, который передают к RuleBasedCollator
конструктор. Вот простой пример:
String simpleRule = "< a < b < c < d"; RuleBasedCollator simpleCollator = new RuleBasedCollator(simpleRule);
Для simpleCollator
объект в предыдущем примере, a
меньше чем b
, который является меньше этим c
, и т.д. simpleCollator.compare
метод ссылается на эти правила, сравнивая строки. Полный синтаксис, используемый, чтобы создать правило сопоставления, более гибок и сложен чем этот простой пример. Для полного описания синтаксиса сошлитесь на документацию API для RuleBasedCollator
class.
Пример, который следует за видами список испанских слов с двумя сортировально-подборочными машинами. Полный исходный код для этого примера находится в RulesDemo.java
.
RulesDemo
программа запускается, определяя правила сопоставления для английского и испанского языка. Программа сортирует испанские слова традиционным способом. Сортируя по традиционным правилам, буквы ch и ll и их эквиваленты верхнего регистра у каждого есть их собственные позиции в порядке сортировки. Эти символьные пары сравниваются, как будто они были одним символом. Например, ch виды как одна буква, после cz в порядке сортировки. Отметьте, как правила для этих двух сортировально-подборочных машин отличаются:
String englishRules = ( "< 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"); String smallnTilde = new String("\u00F1"); // ñ String capitalNTilde = new String("\u00D1"); // Ñ String traditionalSpanishRules = ( "< a,A < b,B < c,C " + "< ch, cH, Ch, CH " + "< d,D < e,E < f,F " + "< g,G < h,H < i,I < j,J < k,K < l,L " + "< ll, lL, Ll, LL " + "< m,M < n,N " + "< " + smallnTilde + "," + capitalNTilde + " " + "< o,O < p,P < q,Q < r,R " + "< s,S < t,T < u,U < v,V < w,W < x,X " + "< y,Y < z,Z");
Следующие строки кода создают сортировально-подборочные машины и вызывают программу сортировки:
try { RuleBasedCollator enCollator = new RuleBasedCollator(englishRules); RuleBasedCollator spCollator = new RuleBasedCollator(traditionalSpanishRules); sortStrings(enCollator, words); printStrings(words); System.out.println(); sortStrings(spCollator, words); printStrings(words); } catch (ParseException pe) { System.out.println("Parse exception for rules"); }
Программа сортировки, вызванная sortStrings
, универсально. Это сортирует любой массив слов согласно правилам любого Collator
объект:
public static void sortStrings(Collator collator, String[] words) { String tmp; for (int i = 0; i < words.length; i++) { for (int j = i + 1; j < words.length; j++) { if (collator.compare(words[i], words[j]) > 0) { tmp = words[i]; words[i] = words[j]; words[j] = tmp; } } } }
Когда сортировано с английскими правилами сопоставления, массив слов следующие:
chalina curioso llama luz
Сравните предыдущий список со следующим, который сортируется согласно традиционным испанским правилам сопоставления:
curioso chalina luz llama