我想在hashmap中搜索一个键并找到离该键最近的键,但返回键不应小于输入值,即使差值更接近,它应该返回更高的close值。 / p>
例如,如果我要搜索值10,它应该返回键12而不是9.或者如果我搜索值13它应该返回17而不是12
我尝试了几种方法,但我仍然无法达到我想要的效果。有谁对此有所了解?
HashMap<Integer, ArrayList> list = new HashMap<Integer, ArrayList>();
list.put(17,null);
list.put(7,null);
list.put(9,null);
list.put(12,null);
public int findCloestButNotLess(int value, Map<Integer, ArrayList> map) {
double minDiff = Double.MAX_VALUE;
int nearest = 0;
for (int key : map.keySet()) {
int diff = Math.abs(value - key);
if (diff < minDiff) {
nearest = key;
minDiff = diff;
}
}
return nearest;
}
答案 0 :(得分:1)
最简单的方法是对键进行排序,并返回大于或等于您正在寻找的键的最小条目。请注意,我更改了签名以返回java.lang.Integer
而不是原始int
,以便在所有密钥都小于搜索值时可以返回null
:
public static Integer findClosestButNotLess(int value, Map<Integer, ?> map) {
return map.keySet()
.stream()
.sorted().filter(k -> k >= value)
.findFirst()
.orElse(null);
}
修改强>
回想起来,排序是一项相对昂贵的操作,您可能会通过对您不关心的部分流进行排序来浪费资源。相反,您可以先过滤掉您不关心的按键,然后只留下最小的剩余密钥:
public static Integer findClosestButNotLess(int value, Map<Integer, ?> map) {
return map.keySet()
.stream()
.filter(k -> k >= value)
.min(Comparator.naturalOrder())
.orElse(null);
}