文档

Java™ 教程-Java Tutorials 中文版
提高排序性能
Trail: Internationalization
Lesson: Working with Text
Section: Comparing Strings

提高排序性能

对长字符串列表进行排序通常很耗时。如果排序算法重复比较字符串,则可以使用 CollationKey 类加快进程。

CollationKey 对象表示给定 StringCollator 的排序键。比较两个 CollationKey 对象涉及排序键的按位比较,并且比使用 Collator.compare 方法比较 String 对象更快。但是,生成 CollationKey 对象需要时间。因此,如果要仅比较 String 一次,Collator.compare 可提供更好的性能。

下面的示例使用 CollationKey 对象对单词数组进行排序。此示例的源代码位于 KeysDemo.java 中。

KeysDemo 程序在 main 方法中创建 CollationKey 对象的数组。要创建 CollationKey,请在 Collator 对象上调用 getCollationKey 方法。你无法比较两个 CollationKey 对象,除非它们来自相同的 Collatormain 方法如下:

static public void main(String[] args) {
    Collator enUSCollator = Collator.getInstance(new Locale("en","US"));
    String [] words = {
        "peach",
        "apricot",
        "grape",
        "lemon"
    };

    CollationKey[] keys = new CollationKey[words.length];

    for (int k = 0; k < keys.length; k ++) {
        keys[k] = enUSCollator. getCollationKey(words[k]);
    }

    sortArray(keys);
    printArray(keys);
}

sortArray 方法调用 CollationKey.compareTo 方法。如果 keys[i] 对象小于,等于或大于 keys[j] 对象,compareTo 方法返回小于,等于或大于零的整数。请注意,程序会比较 CollationKey 对象,而不是原始单词数组中的 String 对象。以下是 sortArray 方法的代码:

public static void sortArray(CollationKey[] keys) {
    CollationKey tmp;

    for (int i = 0; i < keys.length; i++) {
        for (int j = i + 1; j < keys.length; j++) {
            if (keys[i].compareTo(keys[j]) > 0) {
                tmp = keys[i];
                keys[i] = keys[j];
                keys[j] = tmp; 
            }
        }
    }
}

KeysDemo 程序对 CollationKey 对象的数组进行排序,但最初的目标是对 String 对象的数组进行排序。要获取每个 CollationKeyString 表示,程序将在 displayWords 方法中调用 getSourceString,如下所示:

static void displayWords(CollationKey[] keys) {
    for (int i = 0; i < keys.length; i++) {
        System.out.println(keys[i].getSourceString());
    }
}

displayWords 方法打印下:

apricot
grape
lemon
peach

Previous page: Customizing Collation Rules
Next page: Unicode