改善整理性能

对 LongLong 的字符串 列表进行排序通常很耗时。如果您的排序算法反复比较字符串,则可以使用CollationKey类来加快处理速度。

CollationKey对象代表给定StringCollator的排序键。比较两个CollationKey对象涉及对排序键进行按位比较,并且比将String对象与Collator.compare方法进行比较要快。但是,生成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