gpt4 book ai didi

java - 从 Map 中提取没有重复值的键

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:05:25 26 4
gpt4 key购买 nike

map 定义为:

 Map<Integer,String> map = new HashMap<>();
map.put(2,"ram");
map.put(3,"ram");
map.put(4,"gopal");
map.put(5,"madan");
map.put(6,"shyam");
map.put(7,"gopal");
map.put(8,"ram");

我的预期输出是 List,它只包含没有重复值的键。

5
6

我的方法和思考过程:

思考过程 1:

我会采用 map.entrySet().stream().map(....) 然后在 map 中采用另一个流并过滤存在重复值的值。

这种方法很快就被浪费了,因为第一个索引值将在嵌套流中再次进行比较,而我恰好会因此过滤掉所有元素。

思维过程2

我通过以下方式将值保存在不同的 List 中:

List<String> subList = map.entrySet().stream()
.map((k)->k.getValue())
.collect(Collectors.toList());

然后:

    map.entrySet().stream()
.filter(s ->
subList.contains(s.getValue()) )
.map(Map.Entry::getKey)
.collect(Collectors.toList());

但是我得到的输出是

2
3
4
5
6
7
8

输出很明显,因为我从流中选择作为 s 的值,我正在池中比较它,该值将始终存在至少一次。

然后我再次想到,如果我可以有一个计数计数的计数器,并且如果存在该值,那么它会递增,但现在一切似乎都非常模糊。

我可以使用流通过索引进行迭代的任何方式,这样我就可以始终保留我正在使用的键值并与其余值进行比较。

很想得到一个简短的解释。

最佳答案

您可以将任务分成两步。 groupingBy()counting() 收集器重复的第一个计数值。

Map<String,Long> valueCount = map.values()
.stream()
.collect(Collectors.groupingBy(Function.identity(),Collectors.counting()));

其结果是:

{madan=1, shyam=1, gopal=2, ram=3}

第二步是仅查找其值不重复的键。所以要实现这一点,您可以使用 filter() 并根据上一步结果过滤 map 。

map.entrySet()
.stream()
.filter(entry -> valueCount.get(entry.getValue())==1).map(Map.Entry::getKey)
.collect(Collectors.toList())

关于java - 从 Map 中提取没有重复值的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57819113/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com