简体   繁体   English

在Java Map中对Map元素进行排序 <String, List<String> &gt;倒序

[英]Sort Map elements in java Map<String, List<String>> in reverseorder

In my java program, i am getting result like 在我的Java程序中,我得到的结果是

Output: 输出:

acre care race 英亩看护比赛

act cat 扮演猫

Expected: 预期:

act cat 扮演猫

acre care race 英亩看护比赛

Now I want to sort the Map elements in reverse order. 现在,我想以相反的顺序对Map元素进行排序。 So I can get the result like above. 这样我就可以获得上面的结果。 I added my code in below. 我在下面添加了我的代码。

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

By looking at your expected output, it seems you need to sort by length of the list element and then by the sorted list elements if the length is equal 通过查看预期的输出,似乎您需要按列表元素的长度排序,如果长度相等,则需要按排序的列表元素排序

To compare by element length and then list elements 按元素长度比较然后列出元素

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

Since you want only the values to be printed you can use stream on values 由于只希望打印值,因此可以在值上使用流

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

Output 产量

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

To collect the sorted results 收集排序的结果

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

    System.out.println(sortedList);

You can also use TreeMap<String, TreeSet<String>> to sort the map by key and sort the values by Set value 您还可以使用TreeMap<String, TreeSet<String>>来按键对地图进行排序,并按Set值对值进行排序

To sort by key 按键排序

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

You can use TreeMap for this without use HashMap. 您可以为此使用TreeMap而不使用HashMap。 Refer this : http://beginnersbook.com/2014/07/how-to-iterate-treemap-in-reverse-order-in-java/ 请参阅: http : //beginnersbook.com/2014/07/how-to-iterate-treemap-in-reverse-order-in-java/

Unless try as this: 除非这样尝试:

To sort Map: 排序地图:

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

To sort List: 排序列表:
You can sort list inside for loop calling following one before iterate it. 您可以在循环之前对要循环调用的列表进行排序。

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

OR 要么

Collections.reverse(list);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM