Collat​​or比较奇怪的字符串

Beh*_*nil 6 java sorting

我有一组字符串,需要对它进行排序.我正在使用Collat​​or.但输出很奇怪.

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);
}
Run Code Online (Sandbox Code Playgroud)

输出是:

1Z5800701_AB
1Z5800701_AC
1Z5800701A
1Z5800701 A
1Z5800701 - A
1Z5800701-A
1Z5800701B
Run Code Online (Sandbox Code Playgroud)

最后一个字符串'1Z5800701B'应该在'1Z5800701A'之后.我在这里错过了什么?

Mic*_*ski 5

这是使用的语言环境的问题,你可以在bash shell中重现相同的行为LC_ALL=en_US sort.关键是"单词分隔符"与此语言环境中的"单词字符"区别对待(即,您不能总是说字符X在字符B之前或之后排序 - 它取决于上下文).结果是,如果你有1Z5800701 <optional separators> A,它之前进行排序1Z5800701 <optional separators> B,这就是为什么在数字1Z5800701B后面的所有组合A之后,可选地由"分隔符"分隔.您还可以在此维基百科文章中看到更多"不明显"排序的示例