什么决定了Collections.sort中的排序顺序,其中List包含非字母数字字符?

时间:2012-06-06 10:34:15

标签: java sorting

我有代码根据一个名为'title'的属性对String元素进行排序,该属性是String类型。该代码使用Collat​​or,如下所示:

Collator( Collator collator = Collator.getInstance(); ).

我有两个标题为“@a”的对象,另一个对象标题为“#a”

我将这些对象作为List传递并调用

Collections.sort(list,comparator)

这将订单作为

"@a" "#a"

为什么“#a”出现在最后,即使它的ASCII值小于“@a”?

4 个答案:

答案 0 :(得分:4)

根据您的一条评论,您正在使用整理器对标题进行排序。为什么你没有说你的问题在我之外。

无论如何,整理者根据区域设置偏好对字符串进行排序。它不按字典顺序排序。你正在使用的整理者认为正确的顺序是你观察到的顺序。如果你想要字典顺序,你不应该使用整理器。

另请注意,collat​​or始终与区域设置相关联。 Collator.getInstance()方法的javadoc说:

  

获取当前默认语言环境的Collat​​or。

答案 1 :(得分:2)

不,输出为“#a”,“@ a”。这是绝对正确的。

答案 2 :(得分:1)

  

为什么#出现在最后,即使它的ASCII值小于@?

我的洁净室实施:

final List<String> list = Arrays.asList("@a", "#a");
Collections.sort(list);
System.out.println(list);

输出:

  

[#a,@ a]

此代码无法重现您的问题。

供参考:
'#'是0x23
'@'是0x40

一切看起来都很正常。


编辑:您的评论后面的新代码“代码使用了Collat​​or,但其用作Collator collator = Collator.getInstance();并非特定于任何区域设置。”

final List<String> list = Arrays.asList("@a", "#a");
final Collator c = Collator.getInstance();

Collections.sort(list, c);
System.out.println(list);

输出:

  

[@ a,#a]

这会重现您的问题。

如果我使用Collator.getInstance()对ASCII表进行排序,这就是我得到的输出:

  

- ,_ ,,,,,,,,,?,/,。,`,^,',“,(,),[,],{,},@,$,*,\和&amp; ;,#,%,+,&lt ;, =,&gt;,|,0,1,2,3,4,5,6,7,8,9,a,A,b,B,c,C, d,D,e,E,f,F,g,G,h,H,i,I,j,J,k,K,l,L,m,M,n,N,o,O,p, P,q,Q,r,R,s,S,t,T,u,U,v,V,w,W,x,X,y,Y,z,Z

您可以看到这与ASCII整理顺序完全不同:

  

“,#,$,%,&amp;,',(,),*,+ ,,, - ,。,/,0,1,2,3,4,5,6,7,8, 9,:,;,&lt;,=,&gt;,?,@,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P, Q,R,S,T,U,V,W,X,Y,Z,[,\,],^,_,`,a,b,c,d,e,f,g,h,i, j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,{,|,}

对于OP的兴趣,这是用于创建此输出的代码:

final List<String> list = new ArrayList<String>();
final Collator col = Collator.getInstance();

for (char c = '!'; c < '~'; c++)
{
  list.add(c+"");
}

Collections.sort(list, col);
System.out.println(list);

答案 3 :(得分:0)

当您希望订单与正常订单不同时,通常会提供比较器。

List<String> words = new ArrayList<>();
words.add("#a");
words.add("@a");
Collections.sort(words);
System.out.println("Natural order: " + words);

Collections.sort(words, Collections.reverseOrder());
System.out.println("Reverse natural order: " + words);

打印

Natural order: [#a, @a]
Reverse natural order: [@a, #a]

因此,如果订单与ASCII相反,那是因为您在Comparator中定义的是订单(无论您是否知道这样做了)