📄 collator.java
字号:
/* * @(#)Collator.java 1.34 03/01/27 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. *//* * (C) Copyright Taligent, Inc. 1996-1998 - All Rights Reserved * (C) Copyright IBM Corp. 1996-1998 - All Rights Reserved * * The original version of this source code and documentation is copyrighted * and owned by Taligent, Inc., a wholly-owned subsidiary of IBM. These * materials are provided under terms of a License Agreement between Taligent * and Sun. This technology is protected by multiple US and International * patents. This notice and attribution to Taligent may not be removed. * Taligent is a registered trademark of Taligent, Inc. * */package java.text;import java.util.Locale;import java.util.MissingResourceException;import java.util.ResourceBundle;import sun.misc.SoftCache;import sun.text.resources.LocaleData;/** * The <code>Collator</code> class performs locale-sensitive * <code>String</code> comparison. You use this class to build * searching and sorting routines for natural language text. * * <p> * <code>Collator</code> is an abstract base class. Subclasses * implement specific collation strategies. One subclass, * <code>RuleBasedCollator</code>, is currently provided with * the Java 2 platform and is applicable to a wide set of languages. Other * subclasses may be created to handle more specialized needs. * * <p> * Like other locale-sensitive classes, you can use the static * factory method, <code>getInstance</code>, to obtain the appropriate * <code>Collator</code> object for a given locale. You will only need * to look at the subclasses of <code>Collator</code> if you need * to understand the details of a particular collation strategy or * if you need to modify that strategy. * * <p> * The following example shows how to compare two strings using * the <code>Collator</code> for the default locale. * <blockquote> * <pre> * // Compare two strings in the default locale * Collator myCollator = Collator.getInstance(); * if( myCollator.compare("abc", "ABC") < 0 ) * System.out.println("abc is less than ABC"); * else * System.out.println("abc is greater than or equal to ABC"); * </pre> * </blockquote> * * <p> * You can set a <code>Collator</code>'s <em>strength</em> property * to determine the level of difference considered significant in * comparisons. Four strengths are provided: <code>PRIMARY</code>, * <code>SECONDARY</code>, <code>TERTIARY</code>, and <code>IDENTICAL</code>. * The exact assignment of strengths to language features is * locale dependant. For example, in Czech, "e" and "f" are considered * primary differences, while "e" and "\u00EA" are secondary differences, * "e" and "E" are tertiary differences and "e" and "e" are identical. * The following shows how both case and accents could be ignored for * US English. * <blockquote> * <pre> * //Get the Collator for US English and set its strength to PRIMARY * Collator usCollator = Collator.getInstance(Locale.US); * usCollator.setStrength(Collator.PRIMARY); * if( usCollator.compare("abc", "ABC") == 0 ) { * System.out.println("Strings are equivalent"); * } * </pre> * </blockquote> * <p> * For comparing <code>String</code>s exactly once, the <code>compare</code> * method provides the best performance. When sorting a list of * <code>String</code>s however, it is generally necessary to compare each * <code>String</code> multiple times. In this case, <code>CollationKey</code>s * provide better performance. The <code>CollationKey</code> class converts * a <code>String</code> to a series of bits that can be compared bitwise * against other <code>CollationKey</code>s. A <code>CollationKey</code> is * created by a <code>Collator</code> object for a given <code>String</code>. * <br> * <strong>Note:</strong> <code>CollationKey</code>s from different * <code>Collator</code>s can not be compared. See the class description * for {@link CollationKey} * for an example using <code>CollationKey</code>s. * * @see RuleBasedCollator * @see CollationKey * @see CollationElementIterator * @see Locale * @version 1.34, 01/27/03 * @author Helena Shih, Laura Werner, Richard Gillam */public abstract class Collator implements java.util.Comparator, Cloneable { /** * Collator strength value. When set, only PRIMARY differences are * considered significant during comparison. The assignment of strengths * to language features is locale dependant. A common example is for * different base letters ("a" vs "b") to be considered a PRIMARY difference. * @see java.text.Collator#setStrength * @see java.text.Collator#getStrength */ public final static int PRIMARY = 0; /** * Collator strength value. When set, only SECONDARY and above differences are * considered significant during comparison. The assignment of strengths * to language features is locale dependant. A common example is for * different accented forms of the same base letter ("a" vs "\u00E4") to be * considered a SECONDARY difference. * @see java.text.Collator#setStrength * @see java.text.Collator#getStrength */ public final static int SECONDARY = 1; /** * Collator strength value. When set, only TERTIARY and above differences are * considered significant during comparison. The assignment of strengths * to language features is locale dependant. A common example is for * case differences ("a" vs "A") to be considered a TERTIARY difference. * @see java.text.Collator#setStrength * @see java.text.Collator#getStrength */ public final static int TERTIARY = 2; /** * Collator strength value. When set, all differences are * considered significant during comparison. The assignment of strengths * to language features is locale dependant. A common example is for control * characters ("\u0001" vs "\u0002") to be considered equal at the * PRIMARY, SECONDARY, and TERTIARY levels but different at the IDENTICAL * level. Additionally, differences between pre-composed accents such as * "\u00C0" (A-grave) and combining accents such as "A\u0300" * (A, combining-grave) will be considered significant at the tertiary * level if decomposition is set to NO_DECOMPOSITION. */ public final static int IDENTICAL = 3; /** * Decomposition mode value. With NO_DECOMPOSITION * set, accented characters will not be decomposed for collation. This * is the default setting and provides the fastest collation but * will only produce correct results for languages that do not use accents. * @see java.text.Collator#getDecomposition * @see java.text.Collator#setDecomposition */ public final static int NO_DECOMPOSITION = 0; /** * Decomposition mode value. With CANONICAL_DECOMPOSITION * set, characters that are canonical variants according to Unicode 2.0 * will be decomposed for collation. This * should be used to get correct collation of accented characters. * <p> * CANONICAL_DECOMPOSITION corresponds to Normalization Form D as * described in * <a href="http://www.unicode.org/unicode/reports/tr15/">Unicode * Technical Report #15</a>. * @see java.text.Collator#getDecomposition * @see java.text.Collator#setDecomposition */ public final static int CANONICAL_DECOMPOSITION = 1; /** * Decomposition mode value. With FULL_DECOMPOSITION * set, both Unicode canonical variants and Unicode compatibility variants * will be decomposed for collation. This causes not only accented * characters to be collated, but also characters that have special formats * to be collated with their norminal form. For example, the half-width and * full-width ASCII and Katakana characters are then collated together. * FULL_DECOMPOSITION is the most complete and therefore the slowest * decomposition mode. * <p> * FULL_DECOMPOSITION corresponds to Normalization Form KD as * described in * <a href="http://www.unicode.org/unicode/reports/tr15/">Unicode * Technical Report #15</a>. * @see java.text.Collator#getDecomposition * @see java.text.Collator#setDecomposition */ public final static int FULL_DECOMPOSITION = 2; /** * Gets the Collator for the current default locale. * The default locale is determined by java.util.Locale.getDefault. * @return the Collator for the default locale.(for example, en_US) * @see java.util.Locale#getDefault */ public static synchronized Collator getInstance() { return getInstance(Locale.getDefault()); } /** * Gets the Collator for the desired locale. * @param desiredLocale the desired locale. * @return the Collator for the desired locale. * @see java.util.Locale * @see java.util.ResourceBundle */ public static synchronized Collator getInstance(Locale desiredLocale) { RuleBasedCollator result = null; result = (RuleBasedCollator) cache.get(desiredLocale); if (result != null) { return (Collator)result.clone(); // make the world safe } // Load the resource of the desired locale from resource // manager. String colString = ""; int decomp = CANONICAL_DECOMPOSITION; try { ResourceBundle resource = LocaleData.getLocaleElements(desiredLocale); colString = resource.getString("CollationElements"); decomp = ((Integer)resource.getObject("CollationDecomp")).intValue(); } catch (MissingResourceException e) { // Use default values } try { result = new RuleBasedCollator( CollationRules.DEFAULTRULES + colString, decomp ); } catch(ParseException foo) { // predefined tables should contain correct grammar
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -