如何根据列表中的元素对散列表〈String,List>进行排序< String>?Java 8

fnatzsnv  于 2023-02-28  发布在  Java
关注(0)|答案(2)|浏览(114)

我尝试使用lambda表达式和流管道Java 8:

Map<String, List<String>> result = new HashMap<>();

所以,第一部分(按自然顺序排序)很容易,但我对第二部分有困难。
排序应该按照列表(List<String>)的元素进行,结果如下所示:

input:
{E, [G,B,H]}
{C, [E,A,B]}
{A, [M,D,C]}

output:
{A, [C,D,M]}
{C, [A,B,E]}
{E, [B,G,H]}

sort byKey的第一部分如下所示:

result.entrySet().stream()
        .sorted(Map.Entry.comparingByKey()).forEach(e -> {
            System.out.println(e.getKey() + " " + e.getValue() );
        });

但正如我之前提到的,我不知道如何确切地做下一步:

result.entrySet().stream()
            .sorted(Map.Entry.comparingByKey()
                    .thenComparing((e1,e2) -> e1.getValue().stream().sorted((s1,s2) -> s1.compareTo(s2)))
                        )
            .forEach(e -> {
                System.out.println(e.getKey() + " " + e.getValue() );
            });

这个lambda表达式给了我一些编译错误。你也可以添加源代码来阅读吗?

nfeuvbwi

nfeuvbwi1#

你不能依赖键在结果Map中保持排序顺序,因为Map本身是无序的。它看起来可能有效,但它取决于键的hashCodes和其他Map因素。但对于较大的Map,你不能依赖它。要解决这个问题,您可以指定一个TreeMap,它维护键的排序顺序,然后作为结果Map,并使用streams对列表进行排序。

Map<String, List<String>> map = Map.of("E", List.of("G", "B", "H"), "C",
        List.of("E", "A", "B"), "A", List.of("M", "D", "C"));

Map<String, List<String>> result = map.entrySet().stream()
        .collect(Collectors.toMap(Entry::getKey,
                e -> e.getValue().stream().sorted().toList(),
                (a,b)->a, // merge function here, not used but required
                TreeMap::new));

result.entrySet().forEach(System.out::println);

印刷品

A=[C, D, M]
C=[A, B, E]
E=[B, G, H]

另一种方法是根据键对Entry进行排序,然后指定一个LinkedHashMap,LinkedHashMaps保留它们的插入顺序,其他一切都和上面一样。

Map<String, List<String>> result2 = map.entrySet().stream()
.sorted(Entry.comparingByKey())
.collect(Collectors.toMap(Entry::getKey,
        e -> e.getValue().stream().sorted().toList(),
        (a,b)->a,   // merge function here, not used but required
        LinkedHashMap::new));
uqzxnwby

uqzxnwby2#

你就快到了。

public static void main(String[] args) {
        Map<String, List<String>> result = new HashMap<>();
        result.put("E", Arrays.asList("G","B","H"));
        result.put("C", Arrays.asList("E","A","B"));
        result.put("A", Arrays.asList("M","D","C"));

        result.entrySet().stream()
                .sorted(Map.Entry.comparingByKey())
                .forEach(entry -> {
                    String key = entry.getKey();
                    List<String> values = entry.getValue().stream()
                            .sorted()
                            .collect(Collectors.toList());
                    System.out.println(key + ": " + values);
                });
    }

如果要执行sort the original map并创建新的排序Map,可以使用以下代码

Map<String, List<String>> sortedResult = result.entrySet().stream()
        .sorted(Map.Entry.comparingByKey())
        .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().stream()
                .sorted()
                .collect(Collectors.toList())));

相关问题