我正在尝试编写一个接收Map并返回Entry的函数。如果具有最大整数值的条目是唯一的,则应返回该条目。但是,如果有重复的条目具有相同的最大值,它应该返回一个键为“MULTIPLE”且值为0的新条目。我很容易得到忽略重复的最大值:
public static Entry<String,Integer> getMax(Map<String,Integer> map1) {
return map1.entrySet().stream()
.max((a,b) -> a.getValue().compareTo(b.getValue()))
.get();
}
但是为了让我做我最初说的话,我只能找到一个解决方案,我必须创建一个初始流来进行布尔检查,如果有多个最大值,然后再做另一个流,如果没有得到值。我想找到一个解决方案,我可以用一个流来完成这两个任务。
这是我的小测试案例:
@Test
public void test1() {
Map<String,Integer> map1 = new HashMap<>();
map1.put("A", 100);
map1.put("B", 100);
map1.put("C", 100);
map1.put("D", 105);
Assert.assertEquals("D", getMax(map1).getKey());
Map<String,Integer> map2 = new HashMap<>();
map2.put("A", 100);
map2.put("B", 105);
map2.put("C", 100);
map2.put("D", 105);
Assert.assertEquals("MULTIPLE", getMax(map2).getKey());
答案 0 :(得分:1)
这是一个简单的简化案例,您不需要任何外部库。
Map.Entry<String, Integer> max(Map<String, Integer> map) {
return map.entrySet().stream()
.reduce((e1, e2) -> {
if (e1.getValue() == e2.getValue()) {
return new SimpleImmutableEntry<>("MULTIPLE", 0);
} else {
return Collections.max(asList(e1, e2), comparingInt(Map.Entry::getValue));
}
})
.orElse(new SimpleImmutableEntry<>("NOT_FOUND", 0));
}