RuleBasedCollator.java revision adc854b798c1cfe3bfd4c27d68d5cee38ca617da
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project******************************************************************************* 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* Copyright (C) 1996-2007, International Business Machines Corporation and * 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* others. All Rights Reserved. * 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project******************************************************************************* 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project*/ 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// BEGIN android-note 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// The class javadoc and some of the method descriptions are copied from ICU4J 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// source files. Changes have been made to the copied descriptions. 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// The icu license header was added to this file. 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// The icu implementation used was changed from icu4j to icu4jni. 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// END android-note 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.text; 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.text.internal.nls.Messages; 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A concrete implementation class for {@code Collation}. 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code RuleBasedCollator} has the following restrictions for efficiency 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (other subclasses may be used for more complex languages): 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ol> 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li> If a French secondary ordering is specified it applies to the whole 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * collator object.</li> 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li> All non-mentioned Unicode characters are at the end of the collation 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * order.</li> 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li> If a character is not located in the {@code RuleBasedCollator}, the 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * default Unicode Collation Algorithm (UCA) rulebased table is automatically 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * searched as a backup.</li> 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ol> 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The collation table is composed of a list of collation rules, where each rule 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is of three forms: 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote> 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre> 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <modifier> 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <relation> <text-argument> 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <reset> <text-argument> 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre> 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote> 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The rule elements are defined as follows: 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul type="disc"> 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li><strong>Text-Argument</strong>: A text-argument is any sequence of 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * characters, excluding special characters (that is, common whitespace 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * characters [0009-000D, 0020] and rule syntax characters [0021-002F, 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 003A-0040, 005B-0060, 007B-007E]). If those characters are desired, you can 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * put them in single quotes (for example, use '&' for ampersand). Note that 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * unquoted white space characters are ignored; for example, {@code b c} is 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * treated as {@code bc}.</li> 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li><strong>Modifier</strong>: There is a single modifier which is used to 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specify that all accents (secondary differences) are backwards. 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * '@' : Indicates that accents are sorted backwards, as in French. 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </li> 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li><strong>Relation</strong>: The relations are the following: 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul type=square> 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>'<' : Greater, as a letter difference (primary) 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>';' : Greater, as an accent difference (secondary) 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>',' : Greater, as a case difference (tertiary) 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>'=' : Equal 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul> 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </li> 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li><strong>Reset</strong>: There is a single reset which is used primarily 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * for contractions and expansions, but which can also be used to add a 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * modification at the end of a set of rules. 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * '&' : Indicates that the next rule follows the position to where the reset 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * text-argument would be sorted. 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </li> 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul> 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This sounds more complicated than it is in practice. For example, the 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * following are equivalent ways of expressing the same thing: 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote> 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre> 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a < b < c 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a < b & b < c 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a < c & a < b 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre> 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote> 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Notice that the order is important, as the subsequent item goes immediately 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * after the text-argument. The following are not equivalent: 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote> 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre> 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a < b & a < c 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a < c & a < b 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre> 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote> 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Either the text-argument must already be present in the sequence, or some 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * initial substring of the text-argument must be present. For example 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code "a < b & ae < e"} is valid since "a" is present in the sequence before 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * "ae" is reset. In this latter case, "ae" is not entered and treated as a 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * single character; instead, "e" is sorted as if it were expanded to two 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * characters: "a" followed by an "e". This difference appears in natural 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * languages: in traditional Spanish "ch" is treated as if it contracts to a 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * single character (expressed as {@code "c < ch < d"}), while in traditional 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * German a-umlaut is treated as if it expands to two characters (expressed as 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code "a,A < b,B ... & ae;\u00e3 & AE;\u00c3"}, where \u00e3 and \u00c3 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * are the escape sequences for a-umlaut). 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4>Ignorable Characters</h4> 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * For ignorable characters, the first rule must start with a relation (the 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * examples we have used above are really fragments; {@code "a < b"} really 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * should be {@code "< a < b"}). If, however, the first relation is not 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code "<"}, then all text-arguments up to the first {@code "<"} are 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ignorable. For example, {@code ", - < a < b"} makes {@code "-"} an ignorable 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * character. 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4>Normalization and Accents</h4> 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code RuleBasedCollator} automatically processes its rule table to include 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * both pre-composed and combining-character versions of accented characters. 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Even if the provided rule string contains only base characters and separate 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * combining accent characters, the pre-composed accented characters matching 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * all canonical combinations of characters from the rule string will be entered 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in the table. 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This allows you to use a RuleBasedCollator to compare accented strings even 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * when the collator is set to NO_DECOMPOSITION. However, if the strings to be 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * collated contain combining sequences that may not be in canonical order, you 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * should set the collator to CANONICAL_DECOMPOSITION to enable sorting of 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * combining sequences. For more information, see <a 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * href="http://www.aw.com/devpress">The Unicode Standard, Version 3.0</a>. 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4>Errors</h4> 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The following rules are not valid: 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul type="disc"> 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>A text-argument contains unquoted punctuation symbols, for example 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code "a < b-c < d"}.</li> 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>A relation or reset character is not followed by a text-argument, for 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * example {@code "a < , b"}.</li> 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>A reset where the text-argument (or an initial substring of the 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * text-argument) is not already in the sequence or allocated in the default UCA 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * table, for example {@code "a < b & e < f"}.</li> 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul> 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If you produce one of these errors, {@code RuleBasedCollator} throws a 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code ParseException}. 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4>Examples</h4> 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Normally, to create a rule-based collator object, you will use 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Collator}'s factory method {@code getInstance}. However, to create a 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * rule-based collator object with specialized rules tailored to your needs, you 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * construct the {@code RuleBasedCollator} with the rules contained in a 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code String} object. For example: 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote> 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre> 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * String Simple = "< a < b < c < d"; 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * RuleBasedCollator mySimple = new RuleBasedCollator(Simple); 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre> 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote> 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Or: 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote> 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre> 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * String Norwegian = "< a,A< b,B< c,C< d,D< e,E< f,F< g,G< h,H< i,I" 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * + "< j,J< k,K< l,L< m,M< n,N< o,O< p,P< q,Q< r,R" 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * + "< s,S< t,T< u,U< v,V< w,W< x,X< y,Y< z,Z" 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * + "< \u00E5=a\u030A,\u00C5=A\u030A" 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * + ";aa,AA< \u00E6,\u00C6< \u00F8,\u00D8"; 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * RuleBasedCollator myNorwegian = new RuleBasedCollator(Norwegian); 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre> 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote> 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Combining {@code Collator}s is as simple as concatenating strings. Here is 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * an example that combines two {@code Collator}s from two different locales: 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote> 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre> 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // Create an en_US Collator object 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * RuleBasedCollator en_USCollator = (RuleBasedCollator)Collator 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * .getInstance(new Locale("en", "US", "")); 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // Create a da_DK Collator object 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * RuleBasedCollator da_DKCollator = (RuleBasedCollator)Collator 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * .getInstance(new Locale("da", "DK", "")); 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // Combine the two collators 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // First, get the collation rules from en_USCollator 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * String en_USRules = en_USCollator.getRules(); 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // Second, get the collation rules from da_DKCollator 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * String da_DKRules = da_DKCollator.getRules(); 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * RuleBasedCollator newCollator = new RuleBasedCollator(en_USRules + da_DKRules); 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // newCollator has the combined rules 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre> 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote> 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The next example shows to make changes on an existing table to create a new 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Collator} object. For example, add {@code "& C < ch, cH, Ch, CH"} to 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code en_USCollator} object to create your own: 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote> 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre> 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // Create a new Collator object with additional rules 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * String addRules = "& C < ch, cH, Ch, CH"; 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * RuleBasedCollator myCollator = new RuleBasedCollator(en_USCollator + addRules); 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // myCollator contains the new rules 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre> 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote> 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The following example demonstrates how to change the order of non-spacing 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * accents: 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote> 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre> 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // old rule 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * String oldRules = "= \u00a8 ; \u00af ; \u00bf" + "< a , A ; ae, AE ; \u00e6 , \u00c6" 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * + "< b , B < c, C < e, E & C < d, D"; 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // change the order of accent characters 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * String addOn = "& \u00bf ; \u00af ; \u00a8;"; 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * RuleBasedCollator myCollator = new RuleBasedCollator(oldRules + addOn); 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre> 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote> 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The last example shows how to put new primary ordering in before the default 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * setting. For example, in the Japanese {@code Collator}, you can either sort 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * English characters before or after Japanese characters: 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote> 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre> 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // get en_US Collator rules 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * RuleBasedCollator en_USCollator = (RuleBasedCollator) 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Collator.getInstance(Locale.US); 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // add a few Japanese character to sort before English characters 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // suppose the last character before the first base letter 'a' in 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // the English collation rule is \u30A2 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * String jaString = "& \u30A2 , \u30FC < \u30C8"; 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * RuleBasedCollator myJapaneseCollator = 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * new RuleBasedCollator(en_USCollator.getRules() + jaString); 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre> 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote> 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class RuleBasedCollator extends Collator { 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project RuleBasedCollator(com.ibm.icu4jni.text.Collator wrapper) { 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(wrapper); 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new instance of {@code RuleBasedCollator} using the 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specified {@code rules}. The {@code rules} are usually either 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * hand-written based on the {@link RuleBasedCollator class description} or 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the result of a former {@link #getRules()} call. 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Note that the {@code rules} are actually interpreted as a delta to the 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * standard Unicode Collation Algorithm (UCA). Hence, an empty {@code rules} 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * string results in the default UCA rules being applied. This differs 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * slightly from other implementations which work with full {@code rules} 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specifications and may result in different behavior. 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param rules 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the collation rules. 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NullPointerException 319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code rules} is {@code null}. 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ParseException 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code rules} contains rules with invalid collation rule 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * syntax. 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public RuleBasedCollator(String rules) throws ParseException { 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (rules == null) { 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(); 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-removed 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // if (rules.length() == 0) { 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // // text.06=Build rules empty 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // throw new ParseException(Messages.getString("text.06"), 0); //$NON-NLS-1$ 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // } 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END andriod-removed 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.icuColl = new com.ibm.icu4jni.text.RuleBasedCollator(rules); 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-added 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.icuColl.setDecomposition( 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project com.ibm.icu4jni.text.Collator.CANONICAL_DECOMPOSITION); 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-added 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (e instanceof ParseException) { 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw (ParseException) e; 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * -1 means it's not a ParseException. Maybe IOException thrown when 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * an error occured while reading internal data. 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new ParseException(e.getMessage(), -1); 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Obtains a {@code CollationElementIterator} for the given 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code CharacterIterator}. The source iterator's integrity will be 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * preserved since a new copy will be created for use. 358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param source 360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the source character iterator. 361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a {@code CollationElementIterator} for {@code source}. 362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public CollationElementIterator getCollationElementIterator( 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project CharacterIterator source) { 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (source == null) { 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(); 368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new CollationElementIterator( 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ((com.ibm.icu4jni.text.RuleBasedCollator) this.icuColl) 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getCollationElementIterator(source)); 372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Obtains a {@code CollationElementIterator} for the given string. 376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param source 378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the source string. 379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the {@code CollationElementIterator} for {@code source}. 380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public CollationElementIterator getCollationElementIterator(String source) { 383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (source == null) { 384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(); 385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new CollationElementIterator( 387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ((com.ibm.icu4jni.text.RuleBasedCollator) this.icuColl) 388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getCollationElementIterator(source)); 389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the collation rules of this collator. These {@code rules} can be 393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * fed into the {@link #RuleBasedCollator(String)} constructor. 394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Note that the {@code rules} are actually interpreted as a delta to the 396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * standard Unicode Collation Algorithm (UCA). Hence, an empty {@code rules} 397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * string results in the default UCA rules being applied. This differs 398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * slightly from other implementations which work with full {@code rules} 399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specifications and may result in different behavior. 400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the collation rules. 402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getRules() { 405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ((com.ibm.icu4jni.text.RuleBasedCollator) this.icuColl).getRules(); 406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a new collator with the same collation rules, decomposition mode and 410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * strength value as this collator. 411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a shallow copy of this collator. 413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see java.lang.Cloneable 414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Object clone() { 418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project RuleBasedCollator clone = (RuleBasedCollator) super.clone(); 419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return clone; 420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Compares the {@code source} text to the {@code target} text according to 424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the collation rules, strength and decomposition mode for this 425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code RuleBasedCollator}. See the {@code Collator} class description 426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * for an example of use. 427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * General recommendation: If comparisons are to be done with the same strings 429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * multiple times, it is more efficient to generate {@code CollationKey} 430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * objects for the strings and use 431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code CollationKey.compareTo(CollationKey)} for the comparisons. If each 432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * string is compared to only once, using 433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code RuleBasedCollator.compare(String, String)} has better performance. 434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param source 437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the source text. 438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param target 439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the target text. 440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return an integer which may be a negative value, zero, or else a 441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * positive value depending on whether {@code source} is less than, 442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * equivalent to, or greater than {@code target}. 443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int compare(String source, String target) { 447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (source == null || target == null) { 448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // text.08=one of arguments is null 449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(Messages.getString("text.08")); //$NON-NLS-1$ 450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return this.icuColl.compare(source, target); 452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the {@code CollationKey} for the given source text. 456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param source 458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the specified source text. 459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the {@code CollationKey} for the given source text. 460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public CollationKey getCollationKey(String source) { 464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project com.ibm.icu4jni.text.CollationKey icuKey = this.icuColl 465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getCollationKey(source); 466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (icuKey == null) { 467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new CollationKey(source, icuKey); 470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int hashCode() { 474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ((com.ibm.icu4jni.text.RuleBasedCollator) this.icuColl).getRules() 475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .hashCode(); 476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Compares the specified object with this {@code RuleBasedCollator} and 480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * indicates if they are equal. In order to be equal, {@code object} must be 481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * an instance of {@code Collator} with the same collation rules and the 482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * same attributes. 483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param obj 485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the object to compare with this object. 486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the specified object is equal to this 487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code RuleBasedCollator}; {@code false} otherwise. 488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #hashCode 489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0 490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean equals(Object obj) { 493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!(obj instanceof Collator)) { 494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return super.equals(obj); 497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 499