寻找HashMap中最接近的值但不小于

时间:2017-06-03 10:25:22

标签: java list hashmap

我想在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;
        }

1 个答案:

答案 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);
}