【问题标题】:Sorting arraylist of string arrays Java对字符串数组的arraylist进行排序Java
【发布时间】:2017-06-07 12:04:54
【问题描述】:

我有一个程序,它接受一个单词和一个文本文件字典,并在字典中搜索与给定单词相等(是变位词)的单词组合。

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

然后我遍历数组列表并将数组排序为:

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

首先按字长(降序)排序,然后使用字母作为等长单词的决胜局。

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

  • 按字数递增
  • 对于包含相同数量单词且所有单词长度相同的数组,这些数组按字母顺序排序。
  • 字数相等,但长度不同:最长的不相等长度在前。例如,如果 a[0] 长度 == b[0] 长度但 b[1] 长度>a[1] 长度,则 b 先出现。

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

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

【问题讨论】:

    标签: java arrays sorting arraylist comparator


    【解决方案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;
    });
    

    【讨论】:

      猜你喜欢
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-21
      • 2011-07-28
      • 2012-10-14
      • 2012-10-14
      • 2014-08-02
      相关资源
      最近更新 更多