2017-01-23 3 views
0

У меня есть программа, которая берет слово и словарь текстовых файлов и ищет словарь для комбинаций слов, которые равны (являются анаграммами) данного слова.Сортировка arraylist строковых массивов Java

В итоге я получаю массив Arraylist 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, поэтому просто создайте свой собственный. Строительство комплекса Comparator с использованием thenComparing() - это хорошо, но не всегда правильный путь.

Таким образом, ваш код может быть (предполагая, что я получил ваши критерии сортировки справа):

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; 
}); 
Смежные вопросы