java - 对 java Map<String, List<String>> 中的 Map 元素进行逆序排序

标签 java string

在我的java程序中,我得到的结果如下

输出:

acre care race

act cat

预期:

act cat

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

最佳答案

通过查看预期的输出,似乎您需要按列表元素的长度排序,然后如果长度相等则按排序后的列表元素排序

按元素长度进行比较,然后列出元素

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>>按键对 map 进行排序,并按设置值对值进行排序

按键排序

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

关于java - 对 java Map<String, List<String>> 中的 Map 元素进行逆序排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40570673/

相关文章:

java - ExecutorService 具有大量任务

python - 使用 python 以 CSS 方式编码字符串

java - 使用 ListIterator 从列表中删除项目

arrays - 检查数组是否存在于一组数组中

java - eclipse日志中具体数字的含义是什么?

java - 找不到java类: NoClassDefFoundError: KTEngine (Kinetic Typography tool)

java - RGB 整数到 Color 对象

java - 如何在字符串中查找非特定子字符串?

c++ - 控制台输出不断崩溃