在java Map中排序Map元素<string,list <string =“”>&gt;逆序

时间:2016-11-13 04:45:05

标签: java string

在我的java程序中,我得到了像

这样的结果

输出:

  

acre care race

     行动猫

预期:

  行动猫

     

acre care race

现在我想以相反的顺序对Map元素进行排序。所以我可以得到上面的结果。我在下面添加了我的代码。

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");
    }
}

2 个答案:

答案 0 :(得分: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>>按键对地图进行排序,并按设置值

对值进行排序

按键排序

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

答案 1 :(得分:1)

您可以在不使用HashMap的情况下使用TreeMap。 请参阅: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());

OR

Collections.reverse(list);