我有代码根据一个名为'title'的属性对String元素进行排序,该属性是String类型。该代码使用Collator,如下所示:
Collator( Collator collator = Collator.getInstance(); ).
我有两个标题为“@a”的对象,另一个对象标题为“#a”
我将这些对象作为List传递并调用
Collections.sort(list,comparator)
这将订单作为
"@a" "#a"
为什么“#a”出现在最后,即使它的ASCII值小于“@a”?
答案 0 :(得分:4)
根据您的一条评论,您正在使用整理器对标题进行排序。为什么你没有说你的问题在我之外。
无论如何,整理者根据区域设置偏好对字符串进行排序。它不按字典顺序排序。你正在使用的整理者认为正确的顺序是你观察到的顺序。如果你想要字典顺序,你不应该使用整理器。
另请注意,collator始终与区域设置相关联。 Collator.getInstance()
方法的javadoc说:
获取当前默认语言环境的Collator。
答案 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
一切看起来都很正常。
编辑:您的评论后面的新代码“代码使用了Collator,但其用作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中定义的是订单(无论您是否知道这样做了)