有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java字符串数组的排序arraylist

我有一个程序,它获取一个单词和一个文本文件字典,并在字典中搜索与给定单词相等的单词组合

我最终得到了一个字符串数组的Arraylist,每个数组都是一个包含它使用的单词的解决方案,Arraylist是所有解决方案

然后迭代arraylist并将数组排序为:

List<String> list = Arrays.asList(array);
list.sort(Comparator.comparing(String::length).reversed().thenComparing(String::compareTo));

它首先按单词长度(降序)排序,然后使用字母顺序作为等长单词的分界符

我现在已经对各个数组进行了排序,但我正试图在arraylist中按照某些规则对它们进行排序:

  • 按字数递增
  • 对于包含相同字数且所有字长相同的数组,数组按字母顺序排序
  • 字数相等,但长度不同:最长不等长优先。例如,如果a[0]长度==b[0]长度,但b[1]长度>;a[1]长度,b排在第一位

它们已经按单词数的升序存储,因为首先找到单个单词的解决方案,然后找到2个单词,依此类推,并附加到arraylist中

现在,由于数组在排序后也是按字长降序排列的,我认为必须有一个简单的比较器来实现上述功能,但我很难做到这一点


共 (1) 个答案

  1. # 1 楼答案

    首先,无需将数组转换为List进行排序

    其次,应该使用thenComparing(Comparator.naturalOrder())而不是thenComparing(String::compareTo),因为这将使用一个单态Comparator,而不是创建一个新的Comparator委托给方法引用

    至于你的问题,我不认为存在一个Comparator的问题,所以就创建你自己的问题。用thenComparing()建造一个化合物Comparator是不错的,但并不总是正确的方式

    因此,您的代码可能是(假设我正确地获得了排序条件)

    List<String[]> solutions = /* code here */;
    
    // First, sort each individual solution (array)
    for (String[] solution : solutions) {
        Arrays.sort(solution, Comparator.comparing(String::length)
                                        .reversed()
                                        .thenComparing(Comparator.naturalOrder()));
    }
    
    // Second, sort the solutions (list)
    solutions.sort((solution1, solution2) -> {
            // 1) By number of words (ascending)
            int cmp = Integer.compare(solution1.length, solution2.length);
            // 2) By length of word (descending)
            for (int i = 0; cmp == 0 && i < solution1.length; i++)
                cmp = Integer.compare(solution2[i].length(), solution1[i].length());
            // 3) Alphabetically (ascending)
            for (int i = 0; cmp == 0 && i < solution1.length; i++)
                cmp = solution1[i].compareTo(solution2[i]);
            return cmp;
    });