【问题标题】:Sort a string array with Collections based on the content of the split string根据拆分字符串的内容对带有集合的字符串数组进行排序
【发布时间】:2022-01-22 18:56:16
【问题描述】:

我有一个字符串数组,中间有一个空格。我想根据空格之前的第一个子字符串对内容进行排序,然后是空格之后的子字符串。

例如,如果我的数组是这样的:{"Henry 123", "Henry 234", "David 123", "David 234"},最后我想要{"David 123", "David 234", "Henry 123", "Henry 234"}

我尝试在下面实现一个新的比较器:

import java.util.*;

public class MyClass {
    public static void main(String args[]) {
        String[] str_arr = {"Henry 123", "Henry 234", "David 123", "David 234"};

        Collections.sort(str_arr, new Comparator<String>(){
            
            public int compare(String s1, String s2) {
                String[] str1 = s1.split(" ");
                String[] str2 = s2.split(" ");
                if(str1[0].compareTo(str2[0]) != 0) {
                    return str1[0].compareTo(str2[0]);
                }
                return str1[1].compareTo(str2[1]); 
            }            
        });
        
        for (int i = 0; i < str_arr.length; i++) {
            System.out.printf("%s, ", str_arr[i]);
        }
    }
}

但我收到此错误:

MyClass.java:7: 错误:没有找到适合排序的方法(String[],) Collections.sort(str_arr, new Comparator(){ ^ 方法 Collections.sort(List) 不适用 (无法推断类型变量 T#1 (实际参数列表和形式参数列表的长度不同)) 方法 Collections.sort(List,Comparator super T#2>) 不适用 (无法推断类型变量 T#2 (参数不匹配;String[] 无法转换为 List)) 其中 T#1,T#2 是类型变量: T#1 扩展了 Comparable super T#1> 在方法 sort(List) 中声明 T#2 扩展方法中声明的对象 sort(List,Comparator super T#2>) 1 个错误

这个错误听起来像是Collections framework不支持排序字符串,没有多大意义。

【问题讨论】:

  • 您希望{ "Henry 123", "Henry 23", "David 53", "David 234" } 的排序顺序是什么?请显示预期结果。
  • 也许我遗漏了一些东西,但拆分字符串似乎没有必要。您正在比较第一个字符串,如果它们相同,则比较第二个字符串,但仅比较整个字符串将给出完全相同的结果...
  • @magicmn 没错,我最初认为比较数字和数字字符串会产生相同的结果,但正如 WJS 指出的那样,事实并非如此。

标签: java collections


【解决方案1】:

这是一种方法。

String[] arr = { "Henry 123", "Henry 234", "David 123",
        "David 234" };

Comparator<String> comp =
        Comparator.comparing(s -> s.split("\\s+"),
                Comparator.comparing((String[] a) -> a[0])
                        .thenComparing(a -> a[1]));

Arrays.sort(arr,comp);
System.out.println(Arrays.toString(arr))

打印

[David 123, David 234, Henry 123, Henry 234]

如果您想将第二个值作为int 进行比较,请更改为。

...thenComparingInt(a -> Integer.parseInt(a[1])));

请记住,将数字作为字符串进行比较是词汇而非数字,因此结果可能会有所不同。例如,将[55, 123] 与字符串进行比较将导致[123, 55],因为55 在词法上大于123。您的解决方案不起作用的原因是数组不是集合,这是 Collections.sort() 所期望的。

【讨论】:

    【解决方案2】:

    你有一个String 数组Collection.sort 方法确实不支持排序。 Collections.sort 用于对Lists 进行排序。

    你应该改用Arrays.sort

    Arrays.sort(str_arr, (s1, s2) -> {
        String[] str1 = s1.split(" ");
        String[] str2 = s2.split(" ");
        int firstPartcomparison = str1[0].compareTo(str2[0]);
        if(firstPartcomparison != 0) {
            return firstPartcomparison;
        }
        return str1[1].compareTo(str2[1]);
    });
    

    【讨论】:

    • 这也很有帮助,但另一个答案给出了更深入的解释并提醒了一个陷阱。不幸的是,我只能接受一个答案:(
    • @kd8 哦,对了。我没注意到!如果某些数字的位数不同,我可能会注意到:)
    猜你喜欢
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    相关资源
    最近更新 更多