我有一组字符串,需要对其进行排序。我正在使用Collator。 但输出很奇怪。
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'之后。我在这里缺少什么?
答案 0 :(得分:5)
这是使用的语言环境的问题,您可以使用LC_ALL=en_US sort
在bash shell中重现相同的行为。关键是“单词分隔符”与此语言环境中的“单词字符”区别对待(即,您不能总是说字符X在字符B之前或之后排序 - 它取决于上下文)。结果是,如果您有1Z5800701 <optional separators> A
,它会在1Z5800701 <optional separators> B
之前排序,这就是为什么1Z5800701B
出现在A
位于数字之后的所有组合之后,可选地由“分隔符”分隔。您还可以在this Wikipedia articles
答案 1 :(得分:0)
这不是一个错误,它是一个特征:)
java.text.Collator
只有一个默认实现; RuleBasedCollator
,它会忽略白色空格。
http://docs.oracle.com/javase/1.4.2/docs/api/java/text/RuleBasedCollator.html
只需查看Collator的课程
final Collator collator = Collator.getInstance(Locale.US);
System.out.println(collator.getClass().getName());