1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project******************************************************************************* 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* Copyright (C) 1996-2005, International Business Machines Corporation and * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* others. All Rights Reserved. * 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project******************************************************************************* 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project******************************************************************************* 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*/ 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.ibm.icu4jni.text; 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Locale; 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.text.CharacterIterator; 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.text.ParseException; 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.ibm.icu4jni.common.ErrorCode; 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* Concrete implementation class for Collation. 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p> 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* The collation table is composed of a list of collation rules, where each 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* rule is of three forms: 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <pre> 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* < modifier > 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* < relation > < text-argument > 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* < reset > < text-argument > 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </pre> 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p> 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <code>RuleBasedCollator</code> has the following restrictions for efficiency 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* (other subclasses may be used for more complex languages) : 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <ol> 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <li> If a French secondary ordering is specified it applies to the whole 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* collator object. 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <li> All non-mentioned Unicode characters are at the end of the collation 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* order. 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <li> If a character is not located in the RuleBasedCollator, the default 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* Unicode Collation Algorithm (UCA) rulebased table is automatically 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* searched as a backup. 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </ol> 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* The following demonstrates how to create your own collation rules: 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <UL Type=disc> 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <LI><strong>Text-Argument</strong>: A text-argument is any sequence of 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* characters, excluding special characters (that is, common whitespace 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* characters [0009-000D, 0020] and rule syntax characters [0021-002F, 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* 003A-0040, 005B-0060, 007B-007E]). If those characters are desired, 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* you can put them in single quotes (e.g. ampersand => '&'). Note that 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* unquoted white space characters are ignored; e.g. <code>b c</code> is 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* treated as <code>bc</code>. 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <LI><strong>Modifier</strong>: There is a single modifier which is used 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* to specify that all accents (secondary differences) are backwards. 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p>'@' : Indicates that accents are sorted backwards, as in French. 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <LI><strong>Relation</strong>: The relations are the following: 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <UL Type=square> 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <LI>'<' : Greater, as a letter difference (primary) 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <LI>';' : Greater, as an accent difference (secondary) 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <LI>',' : Greater, as a case difference (tertiary) 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <LI>'=' : Equal 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </UL> 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <LI><strong>Reset</strong>: There is a single reset which is used 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* primarily for contractions and expansions, but which can also be used 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* to add a modification at the end of a set of rules. 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p>'&' : Indicates that the next rule follows the position to where 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* the reset text-argument would be sorted. 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </UL> 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p> 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* This sounds more complicated than it is in practice. For example, the 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* following are equivalent ways of expressing the same thing: 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <blockquote> 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <pre> 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* a < b < c 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* a < b & b < c 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* a < c & a < b 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </pre> 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </blockquote> 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* Notice that the order is important, as the subsequent item goes immediately 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* after the text-argument. The following are not equivalent: 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <blockquote> 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <pre> 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* a < b & a < c 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* a < c & a < b 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </pre> 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </blockquote> 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* Either the text-argument must already be present in the sequence, or some 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* initial substring of the text-argument must be present. (e.g. "a < b & ae < 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* e" is valid since "a" is present in the sequence before "ae" is reset). In 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* this latter case, "ae" is not entered and treated as a single character; 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* instead, "e" is sorted as if it were expanded to two characters: "a" 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* followed by an "e". This difference appears in natural languages: in 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* traditional Spanish "ch" is treated as though it contracts to a single 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* character (expressed as "c < ch < d"), while in traditional German a-umlaut 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* is treated as though it expanded to two characters (expressed as "a,A < b,B 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* ... & ae;? & AE;?"). [? and ? are, of course, the escape sequences for 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* a-umlaut.] 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p> 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <strong>Ignorable Characters</strong> 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p> 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* For ignorable characters, the first rule must start with a relation (the 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* examples we have used above are really fragments; "a < b" really should be 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* "< a < b"). If, however, the first relation is not "<", then all the all 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* text-arguments up to the first "<" are ignorable. For example, ", - < a < b" 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* makes "-" an ignorable character, as we saw earlier in the word 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* "black-birds". In the samples for different languages, you see that most 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* accents are ignorable. 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p><strong>Normalization and Accents</strong> 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p> 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <code>RuleBasedCollator</code> automatically processes its rule table to 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* include both pre-composed and combining-character versions of accented 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* characters. Even if the provided rule string contains only base characters 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* and separate combining accent characters, the pre-composed accented 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* characters matching all canonical combinations of characters from the rule 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* string will be entered in the table. 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p> 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* This allows you to use a RuleBasedCollator to compare accented strings even 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* when the collator is set to NO_DECOMPOSITION. However, if the strings to be 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* collated contain combining sequences that may not be in canonical order, you 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* should set the collator to CANONICAL_DECOMPOSITION to enable sorting of 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* combining sequences. 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* For more information, see 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <A HREF="http://www.aw.com/devpress">The Unicode Standard, Version 3.0</A>.) 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p><strong>Errors</strong> 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p> 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* The following are errors: 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <UL Type=disc> 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <LI>A text-argument contains unquoted punctuation symbols 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* (e.g. "a < b-c < d"). 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <LI>A relation or reset character not followed by a text-argument 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* (e.g. "a < , b"). 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <LI>A reset where the text-argument (or an initial substring of the 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* text-argument) is not already in the sequence or allocated in the 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* default UCA table. 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* (e.g. "a < b & e < f") 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </UL> 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* If you produce one of these errors, a <code>RuleBasedCollator</code> throws 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* a <code>ParseException</code>. 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p><strong>Examples</strong> 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p>Simple: "< a < b < c < d" 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p>Norwegian: "< a,A< b,B< c,C< d,D< e,E< f,F< g,G< h,H< i,I< j,J 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* < k,K< l,L< m,M< n,N< o,O< p,P< q,Q< r,R< s,S< t,T 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* < u,U< v,V< w,W< x,X< y,Y< z,Z 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* < ?=a?,?=A? 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* ;aa,AA< ?,?< ?,?" 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p> 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* Normally, to create a rule-based Collator object, you will use 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <code>Collator</code>'s factory method <code>getInstance</code>. 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* However, to create a rule-based Collator object with specialized rules 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* tailored to your needs, you construct the <code>RuleBasedCollator</code> 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* with the rules contained in a <code>String</code> object. For example: 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <blockquote> 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <pre> 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* String Simple = "< a < b < c < d"; 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* RuleBasedCollator mySimple = new RuleBasedCollator(Simple); 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </pre> 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </blockquote> 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* Or: 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <blockquote> 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <pre> 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* String Norwegian = "< a,A< b,B< c,C< d,D< e,E< f,F< g,G< h,H< i,I< j,J" + 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* "< k,K< l,L< m,M< n,N< o,O< p,P< q,Q< r,R< s,S< t,T" + 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* "< u,U< v,V< w,W< x,X< y,Y< z,Z" + 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* "< ?=a?,?=A?" + 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* ";aa,AA< ?,?< ?,?"; 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* RuleBasedCollator myNorwegian = new RuleBasedCollator(Norwegian); 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </pre> 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </blockquote> 171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p> 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* Combining <code>Collator</code>s is as simple as concatenating strings. 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* Here's an example that combines two <code>Collator</code>s from two 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* different locales: 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <blockquote> 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <pre> 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // Create an en_US Collator object 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* RuleBasedCollator en_USCollator = (RuleBasedCollator) 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* Collator.getInstance(new Locale("en", "US", "")); 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // Create a da_DK Collator object 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* RuleBasedCollator da_DKCollator = (RuleBasedCollator) 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* Collator.getInstance(new Locale("da", "DK", "")); 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // Combine the two 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // First, get the collation rules from en_USCollator 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* String en_USRules = en_USCollator.getRules(); 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // Second, get the collation rules from da_DKCollator 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* String da_DKRules = da_DKCollator.getRules(); 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* RuleBasedCollator newCollator = 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* new RuleBasedCollator(en_USRules + da_DKRules); 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // newCollator has the combined rules 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </pre> 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </blockquote> 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p> 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* Another more interesting example would be to make changes on an existing 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* table to create a new <code>Collator</code> object. For example, add 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* "& C < ch, cH, Ch, CH" to the <code>en_USCollator</code> object to create 199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* your own: 200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <blockquote> 201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <pre> 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // Create a new Collator object with additional rules 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* String addRules = "& C < ch, cH, Ch, CH"; 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* RuleBasedCollator myCollator = 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* new RuleBasedCollator(en_USCollator + addRules); 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // myCollator contains the new rules 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </pre> 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </blockquote> 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p> 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* The following example demonstrates how to change the order of 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* non-spacing accents, 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <blockquote> 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <pre> 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // old rule 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* String oldRules = "=?;?;?" // main accents Diaeresis 00A8, Macron 00AF 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // Acute 00BF 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* + "< a , A ; ae, AE ; ? , ?" 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* + "< b , B < c, C < e, E & C < d, D"; 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // change the order of accent characters 221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* String addOn = "& ?;?;?;"; // Acute 00BF, Macron 00AF, Diaeresis 00A8 222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* RuleBasedCollator myCollator = new RuleBasedCollator(oldRules + addOn); 223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </pre> 224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </blockquote> 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p> 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* The last example shows how to put new primary ordering in before the 228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* default setting. For example, in Japanese <code>Collator</code>, you 229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* can either sort English characters before or after Japanese characters, 230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <blockquote> 231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <pre> 232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // get en_US Collator rules 233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* RuleBasedCollator en_USCollator = 234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* (RuleBasedCollator)Collator.getInstance(Locale.US); 235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // add a few Japanese character to sort before English characters 236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // suppose the last character before the first base letter 'a' in 237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // the English collation rule is ? 238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* String jaString = "& \\u30A2 , \\u30FC < \\u30C8"; 239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* RuleBasedCollator myJapaneseCollator = new 240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* RuleBasedCollator(en_USCollator.getRules() + jaString); 241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </pre> 242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </blockquote> 243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <P> 244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* @author syn wee quek 245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* @stable ICU 2.4 246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*/ 247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic final class RuleBasedCollator extends Collator 249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // public constructors ------------------------------------------ 251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * RuleBasedCollator constructor. This takes the table rules and builds a 254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * collation table out of them. Please see RuleBasedCollator class 255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * description for more details on the collation rule syntax. 256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param rules the collation rules to build the collation table from. 257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @exception ParseException thrown if rules are empty or a Runtime error 258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if collator can not be created. 259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @stable ICU 2.4 260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public RuleBasedCollator(String rules) throws ParseException 262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // BEGIN android-changed 264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (rules == null) { 265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException(); 266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // if (rules.length() == 0) 268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // throw new ParseException("Build rules empty.", 0); 269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // END android-changed 270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project m_collator_ = NativeCollation.openCollatorFromRules(rules, 271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CollationAttribute.VALUE_OFF, 272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CollationAttribute.VALUE_DEFAULT_STRENGTH); 273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * RuleBasedCollator constructor. This takes the table rules and builds a 277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * collation table out of them. Please see RuleBasedCollator class 278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * description for more details on the collation rule syntax. 279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param rules the collation rules to build the collation table from. 280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param strength collation strength 281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @exception ParseException thrown if rules are empty or a Runtime error 282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if collator can not be created. 283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #PRIMARY 284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #SECONDARY 285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #TERTIARY 286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #QUATERNARY 287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #IDENTICAL 288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @stable ICU 2.4 289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public RuleBasedCollator(String rules, int strength) throws ParseException 291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // BEGIN android-changed 293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (rules == null) { 294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException(); 295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // if (rules.length() == 0) 297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // throw new ParseException("Build rules empty.", 0); 298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // END android-changed 299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!CollationAttribute.checkStrength(strength)) 300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw ErrorCode.getException(ErrorCode.U_ILLEGAL_ARGUMENT_ERROR); 301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project m_collator_ = NativeCollation.openCollatorFromRules(rules, 303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CollationAttribute.VALUE_OFF, 304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project strength); 305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * RuleBasedCollator constructor. This takes the table rules and builds a 309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * collation table out of them. Please see RuleBasedCollator class 310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * description for more details on the collation rule syntax. 311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p>Note API change starting from release 2.4. Prior to release 2.4, the 312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * normalizationmode argument values are from the class 313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * com.ibm.icu4jni.text.Normalization. In 2.4, 314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the valid normalizationmode arguments for this API are 315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * CollationAttribute.VALUE_ON and CollationAttribute.VALUE_OFF. 316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </p> 317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param rules the collation rules to build the collation table from. 318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param strength collation strength 319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param normalizationmode normalization mode 320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @exception IllegalArgumentException thrown when constructor error occurs 321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #PRIMARY 322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #SECONDARY 323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #TERTIARY 324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #QUATERNARY 325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #IDENTICAL 326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #CANONICAL_DECOMPOSITION 327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #NO_DECOMPOSITION 328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @stable ICU 2.4 329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public RuleBasedCollator(String rules, int normalizationmode, int strength) 331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // BEGIN android-added 333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (rules == null) { 334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException(); 335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // END android-added 337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!CollationAttribute.checkStrength(strength) || 338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project !CollationAttribute.checkNormalization(normalizationmode)) { 339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw ErrorCode.getException(ErrorCode.U_ILLEGAL_ARGUMENT_ERROR); 340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project m_collator_ = NativeCollation.openCollatorFromRules(rules, 343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project normalizationmode, strength); 344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // public methods ----------------------------------------------- 347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Makes a complete copy of the current object. 350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return a copy of this object if data clone is a success, otherwise null 351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @stable ICU 2.4 352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public Object clone() 354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RuleBasedCollator result = null; 356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int collatoraddress = NativeCollation.safeClone(m_collator_); 357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = new RuleBasedCollator(collatoraddress); 358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (Collator)result; 359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The comparison function compares the character data stored in two 363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * different strings. Returns information about whether a string is less 364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * than, greater than or equal to another string. 365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p>Example of use: 366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <br> 367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <code> 368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Collator myCollation = Collator.createInstance(Locale::US); 369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * myCollation.setStrength(CollationAttribute.VALUE_PRIMARY); 370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * // result would be Collator.RESULT_EQUAL ("abc" == "ABC") 371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * // (no primary difference between "abc" and "ABC") 372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * int result = myCollation.compare("abc", "ABC",3); 373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * myCollation.setStrength(CollationAttribute.VALUE_TERTIARY); 374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * // result would be Collation::LESS (abc" <<< "ABC") 375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * // (with tertiary difference between "abc" and "ABC") 376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * int result = myCollation.compare("abc", "ABC",3); 377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </code> 378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param source The source string. 379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param target The target string. 380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return result of the comparison, Collator.RESULT_EQUAL, 381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Collator.RESULT_GREATER or Collator.RESULT_LESS 382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @stable ICU 2.4 383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int compare(String source, String target) 385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return NativeCollation.compare(m_collator_, source, target); 387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the normalization mode for this object. 391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The normalization mode influences how strings are compared. 392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #CANONICAL_DECOMPOSITION 393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #NO_DECOMPOSITION 394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @stable ICU 2.4 395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int getDecomposition() 397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return NativeCollation.getNormalization(m_collator_); 399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p>Sets the decomposition mode of the Collator object on or off. 403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If the decomposition mode is set to on, string would be decomposed into 404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * NFD format where necessary before sorting.</p> 405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </p> 406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param decompositionmode the new decomposition mode 407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #CANONICAL_DECOMPOSITION 408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #NO_DECOMPOSITION 409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @stable ICU 2.4 410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void setDecomposition(int decompositionmode) 412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!CollationAttribute.checkNormalization(decompositionmode)) 414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw ErrorCode.getException(ErrorCode.U_ILLEGAL_ARGUMENT_ERROR); 415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project NativeCollation.setAttribute(m_collator_, 416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CollationAttribute.NORMALIZATION_MODE, 417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project decompositionmode); 418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Determines the minimum strength that will be use in comparison or 422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * transformation. 423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p> 424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * E.g. with strength == CollationAttribute.VALUE_SECONDARY, the tertiary difference 425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is ignored 426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </p> 427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p> 428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * E.g. with strength == PRIMARY, the secondary and tertiary difference are 429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ignored. 430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </p> 431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the current comparison level. 432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #PRIMARY 433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #SECONDARY 434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #TERTIARY 435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #QUATERNARY 436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #IDENTICAL 437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @stable ICU 2.4 438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int getStrength() 440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return NativeCollation.getAttribute(m_collator_, 442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CollationAttribute.STRENGTH); 443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Sets the minimum strength to be used in comparison or transformation. 447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p>Example of use: 448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <br> 449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <code> 450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Collator myCollation = Collator.createInstance(Locale::US); 451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * myCollation.setStrength(PRIMARY); 452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * // result will be "abc" == "ABC" 453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * // tertiary differences will be ignored 454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * int result = myCollation->compare("abc", "ABC"); 455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </code> 456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param strength the new comparison level. 457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @exception IllegalArgumentException when argument does not belong to any collation strength 458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * mode or error occurs while setting data. 459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #PRIMARY 460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #SECONDARY 461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #TERTIARY 462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #QUATERNARY 463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #IDENTICAL 464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @stable ICU 2.4 465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void setStrength(int strength) 467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!CollationAttribute.checkStrength(strength)) 469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw ErrorCode.getException(ErrorCode.U_ILLEGAL_ARGUMENT_ERROR); 470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project NativeCollation.setAttribute(m_collator_, CollationAttribute.STRENGTH, 471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project strength); 472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Sets the attribute to be used in comparison or transformation. 476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p>Example of use: 477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <br> 478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <code> 479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Collator myCollation = Collator.createInstance(Locale::US); 480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * myCollation.setAttribute(CollationAttribute.CASE_LEVEL, 481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * CollationAttribute.VALUE_ON); 482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * int result = myCollation->compare("\\u30C3\\u30CF", 483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "\\u30C4\\u30CF"); 484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * // result will be Collator.RESULT_LESS. 485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </code> 486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param type the attribute to be set from CollationAttribute 487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param value attribute value from CollationAttribute 488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @stable ICU 2.4 489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void setAttribute(int type, int value) 491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!CollationAttribute.checkAttribute(type, value)) 493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw ErrorCode.getException(ErrorCode.U_ILLEGAL_ARGUMENT_ERROR); 494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project NativeCollation.setAttribute(m_collator_, type, value); 495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the attribute to be used in comparison or transformation. 499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param type the attribute to be set from CollationAttribute 500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return value attribute value from CollationAttribute 501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @stable ICU 2.4 502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int getAttribute(int type) 504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!CollationAttribute.checkType(type)) 506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw ErrorCode.getException(ErrorCode.U_ILLEGAL_ARGUMENT_ERROR); 507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return NativeCollation.getAttribute(m_collator_, type); 508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the sort key as an CollationKey object from the argument string. 512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * To retrieve sort key in terms of byte arrays, use the method as below<br> 513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <br> 514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <code> 515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Collator collator = Collator.getInstance(); 516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * byte[] array = collator.getSortKey(source); 517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </code><br> 518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Byte array result are zero-terminated and can be compared using 519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * java.util.Arrays.equals(); 520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param source string to be processed. 521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the sort key 522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @stable ICU 2.4 523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public CollationKey getCollationKey(String source) 525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // BEGIN android-removed 527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // return new CollationKey(NativeCollation.getSortKey(m_collator_, source)); 528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // END android-removed 529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // BEGIN android-added 530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if(source == null) { 531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return null; 532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] key = NativeCollation.getSortKey(m_collator_, source); 534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if(key == null) { 535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return null; 536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return new CollationKey(key); 538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // END android-added 539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get a sort key for the argument string 543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Sort keys may be compared using java.util.Arrays.equals 544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param source string for key to be generated 545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return sort key 546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @stable ICU 2.4 547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public byte[] getSortKey(String source) 549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return NativeCollation.getSortKey(m_collator_, source); 551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the collation rules of this Collation object 555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The rules will follow the rule syntax. 556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return collation rules. 557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @stable ICU 2.4 558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String getRules() 560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return NativeCollation.getRules(m_collator_); 562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Create a CollationElementIterator object that will iterator over the 566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * elements in a string, using the collation rules defined in this 567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * RuleBasedCollator 568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param source string to iterate over 569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return address of C collationelement 570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @exception IllegalArgumentException thrown when error occurs 571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @stable ICU 2.4 572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public CollationElementIterator getCollationElementIterator(String source) 574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CollationElementIterator result = new CollationElementIterator( 576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project NativeCollation.getCollationElementIterator(m_collator_, source)); 577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // result.setOwnCollationElementIterator(true); 578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // BEGIN android-added 582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Create a CollationElementIterator object that will iterator over the 584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * elements in a string, using the collation rules defined in this 585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * RuleBasedCollator 586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param source string to iterate over 587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return address of C collationelement 588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @exception IllegalArgumentException thrown when error occurs 589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @stable ICU 2.4 590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public CollationElementIterator getCollationElementIterator( 592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CharacterIterator source) 593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CollationElementIterator result = new CollationElementIterator( 595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project NativeCollation.getCollationElementIterator(m_collator_, 596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project source.toString())); 597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // result.setOwnCollationElementIterator(true); 598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // END android-added 601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns a hash of this collation object 604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note this method is not complete, it only returns 0 at the moment. 605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return hash of this collation object 606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @stable ICU 2.4 607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int hashCode() 609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // since rules do not change once it is created, we can cache the hash 611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (m_hashcode_ == 0) { 612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project m_hashcode_ = NativeCollation.hashCode(m_collator_); 613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (m_hashcode_ == 0) 614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project m_hashcode_ = 1; 615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return m_hashcode_; 617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Checks if argument object is equals to this object. 621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param target object 622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return true if source is equivalent to target, false otherwise 623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @stable ICU 2.4 624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public boolean equals(Object target) 626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (this == target) 628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return true; 629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (target == null) 630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (getClass() != target.getClass()) 632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RuleBasedCollator tgtcoll = (RuleBasedCollator)target; 635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return getRules().equals(tgtcoll.getRules()) && 636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project getStrength() == tgtcoll.getStrength() && 637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project getDecomposition() == tgtcoll.getDecomposition(); 638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // package constructor ---------------------------------------- 641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * RuleBasedCollator default constructor. This constructor takes the default 644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * locale. The only caller of this class should be Collator.getInstance(). 645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Current implementation createInstance() returns a RuleBasedCollator(Locale) 646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instance. The RuleBasedCollator will be created in the following order, 647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <ul> 648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li> Data from argument locale resource bundle if found, otherwise 649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li> Data from parent locale resource bundle of arguemtn locale if found, 650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * otherwise 651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li> Data from built-in default collation rules if found, other 652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li> null is returned 653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </ul> 654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RuleBasedCollator() 656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project m_collator_ = NativeCollation.openCollator(); 658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * RuleBasedCollator constructor. This constructor takes a locale. The 662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * only caller of this class should be Collator.createInstance(). 663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Current implementation createInstance() returns a RuleBasedCollator(Locale) 664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instance. The RuleBasedCollator will be created in the following order, 665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <ul> 666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li> Data from argument locale resource bundle if found, otherwise 667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li> Data from parent locale resource bundle of arguemtn locale if found, 668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * otherwise 669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li> Data from built-in default collation rules if found, other 670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li> null is returned 671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </ul> 672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param locale locale used 673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RuleBasedCollator(Locale locale) 675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (locale == null) { 677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project m_collator_ = NativeCollation.openCollator(); 678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else { 680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project m_collator_ = NativeCollation.openCollator(locale.toString()); 681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // protected methods -------------------------------------------- 685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Garbage collection. 688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Close C collator and reclaim memory. 689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected void finalize() 691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project NativeCollation.closeCollator(m_collator_); 693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // private data members ----------------------------------------- 696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * C collator 699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private int m_collator_; 701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Hash code for rules 704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private int m_hashcode_ = 0; 706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // private constructor ----------------------------------------- 708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Private use constructor. 711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Does not create any instance of the C collator. Accepts argument as the 712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * C collator for new instance. 713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param collatoraddress address of C collator 714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private RuleBasedCollator(int collatoraddress) 716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project m_collator_ = collatoraddress; 718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 720