文档

Java™ 教程
隐藏目录
提高排序性能
路径:国际化
课程:处理文本
章节:比较字符串

改进排序性能

对长列表的字符串进行排序通常是耗时的。如果您的排序算法需要重复比较字符串,您可以使用 CollationKey 类来加快这个过程。

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

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

KeysDemo 程序在 main 方法中创建了一个 CollationKey 对象数组。要创建一个 CollationKey,您需要在 Collator 对象上调用 getCollationKey 方法。除非两个 CollationKey 对象来自相同的 Collator,否则不能比较它们。以下是 main 方法的代码:

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

上一页:自定义排序规则
下一页:Unicode