【问题标题】:Looking for The Closest Value in HashMap but not lesser than在 HashMap 中寻找最接近的值但不小于
【发布时间】:2017-06-03 10:25:21
【问题描述】:

我想在 hashmap 中搜索一个键并找到最接近该键的键,但返回键不应小于输入值,即使不同更接近,它应该返回更高的更接近的值。

例如,如果我要搜索值 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;
        }

【问题讨论】:

  • 如果订单很重要,您应该使用TreeMap

标签: java list hashmap


【解决方案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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多