6

文字列のコレクションがあり、それを並べ替える必要があります。コレーターを使用しています。しかし、出力は奇妙です。

final Collator collator = Collator.getInstance(Locale.US);

List<String> data = new ArrayList<String>();

data.add("1Z5800701_AB");
data.add("1Z5800701_AC");
data.add("1Z5800701-A");
data.add("1Z5800701 A");
data.add("1Z5800701B");
data.add("1Z5800701A");
data.add("1Z5800701 - A");

Collections.sort(data, new Comparator<String>() {

    @Override
    public int compare(String o1, String o2) {
        return collator.compare(o1, o2);
    }
});

for (String s : data) {
    System.out.println(s);
}

出力は次のとおりです。

1Z5800701_AB
1Z5800701_AC
1Z5800701A
1Z5800701 A
1Z5800701 - A
1Z5800701-A
1Z5800701B

最後の文字列 '1Z5800701B' は '1Z5800701A' の後にある必要があります。ここで何が欠けていますか?

4

2 に答える 2

5

使用するロケールの問題です.bashシェルで同じ動作を再現できますLC_ALL=en_US sort. 要点は、このロケールでは「単語の区切り記号」は「単語の文字」とは異なる方法で扱われるということです (つまり、文字 X が文字 B の前または後にソートされると常に言うことはできません - それは文脈によって異なります)。結果は、 がある場合、 の前に1Z5800701 <optional separators> Aソートされます。そのため、 が数字の後に来るすべての組み合わせの後に、オプションで「セパレーター」で区切られます。このウィキペディアの記事では、「明らかではない」順序付けの例をさらにいくつか見ることができます。1Z5800701 <optional separators> B1Z5800701BA

于 2013-03-05T18:00:50.760 に答える
0

それはバグではなく、機能です:)

java.text.Collatorデフォルトの実装は 1 つだけです。RuleBasedCollator、空白は無視されます。

http://docs.oracle.com/javase/1.4.2/docs/api/java/text/RuleBasedCollat​​or.html

Collat​​orのクラスを確認するだけです

final Collator collator = Collator.getInstance(Locale.US);
System.out.println(collator.getClass().getName());
于 2013-03-05T18:31:28.710 に答える