2016-11-13 3 views
1

В моей Java программы, я получаю результат, какСортировка элементов карты в Java Map <String, List <String>> в ReverseOrder

Выход:

гонки по уходу за акр

акт кошки

Ожидаемое:

акт гонки кошка

уход за акр

Теперь я хочу, чтобы отсортировать элементы Карта в обратном порядке. Поэтому я могу получить результат, как и выше. Я добавил код ниже.

public static void main(String args[]) { 

    try { 
     Scanner sc = readWords(); 
     Map<String, List<String>> wordAnagramPairs = new HashMap<>(); 
     wordAnagramPairs = mapAnagrams(sc); 
     Comparator<List<String>> c = (l1, l2) -> { 
      Collections.sort(l1); 
      Collections.sort(l2); 
      int in = l1.get(0).length() - l2.get(0).length(); 
      if (in == 0) { 
       return String.join(" ", l1).compareTo(String.join(" ", l2)); 
      } else { 
       return in; 
      } 
     }; 
     List<List<String>> sortedList = wordAnagramPairs.values() 
       .stream() 
       .filter(li -> li != null && li.size() > 1) 
       .sorted(c) 
       .collect(Collectors.toList()); 

     for(List<String> anagrams : sortedList){ 
      for(String anagram : anagrams){ 
       System.out.print(anagram + " "); 
      } 
      System.out.print('\n'); 
     } 

    } catch (FileNotFoundException e) { 
     System.out.println("File Not Found"); 
    } 
} 
+0

Используйте 'TreeMap' вместо' HashMap' – iNan

ответ

1

Глядя на ожидаемом выходе, это, кажется, вам нужно сортировать по длине элемента списка, а затем отсортированный список элементов, если длина равна

Для сравнения: по длине элемента, а затем список элементы

Comparator<List<String>> c = (l1, l2) -> { 
      Collections.sort(l1); // elements to be sorted 
      Collections.sort(l2); // elements to be sorted 
      int in = l1.get(0).length() - l2.get(0).length(); 
      if (in == 0) { 
       return String.join(" ", l1).compareTo(String.join(" ", l2)); 
      } else { 
       return in; 
      } 
     }; 

Поскольку вы хотите только значения для печати вы можете использовать поток на значениях

Map<String, List<String>> wordAnagramPairs = new HashMap<>(); 
    wordAnagramPairs.put("race", Arrays.asList("race", "care", "acre")); 
    wordAnagramPairs.put("act", Arrays.asList("act", "cat")); 
    wordAnagramPairs.values().stream() 
          .filter(li -> li != null && li.size() > 1) 
          .sorted(c) 
          .forEach(System.out::println); 

Выходные

[act, cat] 
[acre, care, race] 

Собирать отсортированные результаты

List<List<String>> sortedList = wordAnagramPairs.values().stream().filter(li -> li != null && li.size() > 1).sorted(c) 
      .collect(Collectors.toList()); 

    System.out.println(sortedList); 

Вы также можете использовать TreeMap<String, TreeSet<String>> сортировать карту с помощью ключа и сортировки значений по значению Set

Для сортировки по ключевым

wordAnagramPairs.entrySet() 
        .stream() 
        .filter(e -> e.getValue().size() > 1) 
        .sorted(Map.Entry.comparingByKey()) 
        .forEach(System.out::println); 
+0

Я попробовал оба решения, но до сих пор не работает. Это тот же результат. –

+0

Вы попробовали первый компаратор? См. Вывод, он соответствует вашему ожидаемому результату. – Saravana

+0

добавьте все входы в вопрос, также укажите, какой из них не работает – Saravana

1

Вы можете использовать TreeMap для этого без использования HashMap. Смотрите так: http://beginnersbook.com/2014/07/how-to-iterate-treemap-in-reverse-order-in-java/

Если не пытаться, как это:

Для сортировки Карты:

Map<String, List<String>> sortedMap = new TreeMap<String, List<String>>(Collections.reverseOrder()); 
sortedMap .putAll(wordAnagramPairs); 

Для сортировки списка:
Вы можете сортировать список внутри для вызова петли следующего друга перед тем итерации его.

Collections.sort(list, Collections.reverseOrder()); 

ИЛИ

Collections.reverse(list); 
Смежные вопросы