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 shell 中使用LC_ALL=en_US sort. 关键是“单词分隔符”在此语言环境中与“单词字符”的处理方式不同(即,您不能总是说字符 X 在字符 B 之前或之后排序 - 这取决于上下文)。结果是,如果您有1Z5800701 <optional separators> A,它会排在 之前1Z5800701 <optional separators> B,这就是为什么1Z5800701B在所有组合A之后出现在数字之后的所有组合,可选地用“分隔符”分隔。您还可以在此 Wikipedia 文章中看到更多“不明显”排序的示例

于 2013-03-05T18:00:50.760 回答
0

这不是一个错误,这是一个功能 :)

java.text.Collator只有一个默认实现;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 回答