Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
字符串的Java集合排序方法对于区分大小写和特殊字符无法正常工作_Java_Sorting_Collections - Fatal编程技术网

字符串的Java集合排序方法对于区分大小写和特殊字符无法正常工作

字符串的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"

我当时正在用Java(1.8)对字符串列表进行排序,结果发现它没有按预期工作

我正在尝试以下代码进行排序:

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]