在Java中,基于value获取第一个LinkedHashMap的key是什么?

3
我使用以下 LinkedHashMap 并将数字的出现次数表示为 <number, occurences>
Map<Integer, Integer> map = new LinkedHashMap<>();

地图中存储的值如下所示:

key | value
4   | 2
10  | 2
5   | 1
3   | 1

我想获取第一个值为1的键(在示例中,它是5)。如果没有一个值为1的键,则返回-1。我使用以下方法,但我认为这不是一个适当的方法,可能有更好或更短的方法来实现这个目标:

int key = map.containsValue(1) ?
                map.entrySet().stream()
                   .filter(entry -> entry.getValue() == 1)
                   .map(Map.Entry::getKey).findFirst().get() : -1;

那么,有更好的方法来实现这个吗?


1
“更好”的方式是什么意思?在哪方面更好? - Sweeper
@Sweepy 短小简洁,或者更快 - user18952345
我想你可以跳过 map.containsValue() - havryliuk
@havriluk 但是如果没有任何键的值为1,我需要返回-1。那么,我该怎么办? - user18952345
@stack 请查看下面的第一个答案。 - havryliuk
1个回答

1
与其先检查containsValue,不如在由findFirst返回的可选项上使用orElse,这样可以少遍历一次映射。
int key = map.entrySet().stream()
               .filter(entry -> entry.getValue() == 1)
               .map(Map.Entry::getKey).findFirst().orElse(-1);

findFirst 如果在过滤后没有剩余值,则返回一个空的可选项。这只会发生在地图中一开始就没有值1的情况下。 orElse 如果可选项为空,则返回其参数,否则返回包装的值。


这正是我正在寻找的,非常感谢朋友的投票支持。另一方面,我还在另一个地方使用了 map.getOrDefault 方法,例如 int value = map.getOrDefault(key, 0) + 1; 在这部分中,我想将键的值增加1(如果键不存在于映射中,则从0开始并添加+1)。那么,在此示例中是否也有更好的 getOrDefault 方法? - user18952345
@stack 你想从一个值中获取一个键,而不是从一个键中获取一个值,所以 getOrDefault 是无法帮助你的。 :( - Sweeper
不好意思,我只需要“int value = map.getOrDefault(key, 0) + 1;”这部分的翻译。在这个例子中,我想要检查键是否存在,并将其值增加1(如果不存在,则将其设置为1)。那么,对于这部分有什么建议吗? - user18952345
非常感谢,完全正确。但是我不明白应该如何替换我的示例中的最后一个参数:int value = map.merge(key, 1, Integer::sum) 或者另一种用法是 map.merge(key, 1, (a,b) -> a+b);。有什么想法吗? - user18952345
好的,朋友,将此回复标记为答案并在https://dev59.com/ZsTra4cB1Zd3GeqP8HaJ上开启一个新问题。 - user18952345
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接