字符串的Java集合排序方法对于区分大小写和特殊字符无法正常工作
我当时正在用Java(1.8)对字符串列表进行排序,结果发现它没有按预期工作 我正在尝试以下代码进行排序:字符串的Java集合排序方法对于区分大小写和特殊字符无法正常工作,java,sorting,collections,Java,Sorting,Collections,我当时正在用Java(1.8)对字符串列表进行排序,结果发现它没有按预期工作 我正在尝试以下代码进行排序: private Set<String> getTestData() { Set<String> compRoles = new HashSet<>(); compRoles.add("AA"); compRoles.add("Aa"); compRoles.add("aA"); compRoles.add("aa"
private Set<String> getTestData() {
Set<String> compRoles = new HashSet<>();
compRoles.add("AA");
compRoles.add("Aa");
compRoles.add("aA");
compRoles.add("aa");
compRoles.add("11");
compRoles.add("117");
compRoles.add("12");
compRoles.add("21");
compRoles.add("!@");
compRoles.add("@!");
compRoles.add("@@!");
compRoles.add("BB");
compRoles.add("Bb");
compRoles.add("bb");
return compRoles;
}
public static void main(String args[]) {
List<String> test = new ArrayList<>(new Test().getTestData());
System.out.println(test);
Collections.sort(test);
System.out.println(test);
}
private Set getTestData(){
Set compRoles=new HashSet();
加上(“AA”);
加上(“Aa”);
加上(“aA”);
加上(“aa”);
加上(“11”);
添加(“117”);
加上(“12”);
加上(“21”);
压缩。添加(“!@”);
compRoles.add(“@!”);
compRoles.add(“@!”);
加上(“BB”);
加上(“Bb”);
加上(“bb”);
返回孔;
}
公共静态void main(字符串参数[]){
List test=new ArrayList(new test().getTestData());
系统输出打印LN(测试);
收集.分类(测试);
系统输出打印LN(测试);
}
排序前:[AA、AA、AA、11、BB、BB、BB、12、@!、@!、117、21、!@
排序后:[!@、11、117、12、21、@!、@!、@!、AA、AA、BB、BB、AA、AA、BB]
我的期望是:[!@、@!、@!、11、117、12、21、aa、aa、aa、aa、aa、bb、bb]
我需要使用自然排序以外的其他方法吗?您可以为排序逻辑创建自定义。在此之后,您可以像这样使用它:
Collections.sort(yourArrayList, new YourComparator());
您可以使用Java类
public static void main(String[] args) {
List<String> test = new ArrayList<>(new Test().getTestData());
System.out.println(test);
test.sort(Collator.getInstance(Locale.ENGLISH));
System.out.println(test);
}
所以,对你来说,“a”在“a”之前。。好啊嗯,您需要编写自己的排序逻辑,但它将非常广泛。实际上,您必须逐个字符进行比较。祝你好运。答案在问题中。考虑到自然排序并不像您希望的那样对元素进行排序,您需要一些其他的东西。这已经在jQuery排序中实现了。但我不知道他们使用的算法!由于此UI和后端不同步。有什么想法吗?unicode的!小于@,unicode of@小于1,unicode of 1小于A,unicode of A小于A。希望它能满足您得到的输出。现在,如果您需要根据您的排序进行排序,请使用比较器。@nits.kk:我完全同意jaspreet给出的答案。我们可以通过使用合适的答案来解决这个问题。我知道比较器和comparable的用法。我正在寻找这背后使用的逻辑或算法。然后你的问题应该看起来像你需要一个自定义比较器,并且应该包含关于排序算法的问题。最简单的方法是为每个字母设置权重,并以自己的方式进行比较。现在,
List
类有自己的sort
方法,因此不需要进行排序。这样编写代码更清晰一些:list.sort(Collator.getInstance(Locale.ENGLISH))代码>。谢谢@Lii。更新了答案。我没有读到他在用Java 8,所以回答了Collections.sort而不是list.sort。我们的答案中并不总是清楚要针对哪个Java版本。但是Java8已经推出近5年了!我认为我们可以有把握地认为这是标准。现在,您甚至可以这样声明列表:var test=new ArrayList(new test().getTestData())代码>
[AA, Aa, aA, aa, 11, BB, Bb, bb, 12, @!, @@!, 117, 21, !@]
[!@, @!, @@!, 11, 117, 12, 21, aa, aA, Aa, AA, bb, Bb, BB]