0

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

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

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

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

Collections.sort(list,comparator)

这给出了顺序

"@a" "#a"

为什么 "#a" 的 ASCII 值小于 "@a" 却最后出现?

4

4 回答 4

4

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

无论如何,整理者根据语言环境偏好对字符串进行排序。它不按字典顺序排序。您使用的整理者认为正确的顺序是您观察到的顺序。如果你想要字典顺序,你不应该使用整理者。

另请注意,整理者始终与语言环境相关联。方法的javadocCollator.getInstance()说:

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

于 2012-06-06T11:03:26.393 回答
2

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

于 2012-06-06T10:36:06.163 回答
1

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

我的洁净室实施:

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

输出:

[#a,@a]

此代码不会重现您的问题。

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

一切看起来都很正常。


编辑:您的评论后的新代码“代码使用整理器,但它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 表进行排序,这是我得到的输出:

-, _, ,, ;, :, !, ?, /, ., `, ^, ', ", (, ), [, ], {, }, @, $, *, \, &, #, %, +, <, =, >, |, 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 整理顺序完全不同:

", #, $, %, &, ', (, ), *, +, ,, -, ., /, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, :, ;, <, =, >, ?, @, 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);
于 2012-06-06T10:38:38.807 回答
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 中定义的顺序(无论您是否知道您这样做了)

于 2012-06-06T10:42:50.660 回答