2017-01-23 50 views
0

我有一个程序需要一个单词和一个文本文件字典,并搜索字典中与给定单词相等(都是anagrams)的单词组合。字符串数组的排列Array列表Java

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

我然后遍历数组列表和数组作为排序:

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

,其通过字长度(降序)排序第一,然后使用字母作为仲裁断路器相等的长度的话。

我现在已经单独的阵列进行排序,但我试图将它们按照一定的规则在ArrayList中的排序:按升序话

  • 的数量包含单词的数量相等阵列

    • ,和所有单词长度相同,数组按字母顺序排序。
    • 字数相等,但长度不同:最长不等长的第一个。例如,如果[0]长度== b [0]长度但b [1]长度> a [1]长度,则b首先出现。

    它们已经按单词升序存储,因为单词解决方案首先被发现,然后是2个单词等,被附加到数组列表中。

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

  • 回答

    0

    首先,没有必要将数组转换为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; 
    });