在HashMap中找到最接近的答案

时间:2012-02-28 13:42:21

标签: java hashmap

我想在hashmap中搜索一个键,找到离该键最近的一个键!

    HashMap<Long, Object> map = new HashMap<Long , Object>();

所以基本上我想搜索一个长的,如果它在地图中不存在,找到最接近的那个长值! 我怎么能这样做??

提前完成

6 个答案:

答案 0 :(得分:15)

如果没有迭代所有键,就无法使用HashMap。我认为这不是你所追求的,所以这是一种用TreeMap做的方法:

TreeMap<Long,Object> map = new TreeMap<Long,Object>();
Long key = 42;
Map.Entry<Long,Object> low = map.floorEntry(key);
Map.Entry<Long,Object> high = map.ceilingEntry(key);
Object res = null;
if (low != null && high != null) {
    res = Math.abs(key-low.getKey()) < Math.abs(key-high.getKey())
    ?   low.getValue()
    :   high.getValue();
} else if (low != null || high != null) {
    res = low != null ? low.getValue() : high.getValue();
}

答案 1 :(得分:12)

使用像TreeMap这样的NavigableMap

long key = 
NavigableMap<Long, Object> map = new TreeMap<Long , Object>();

Long before = map.floorKey(key);
Long after = map.ceilingKey(key);
if (before == null) return after;
if (after == null) return before;
return (key - before < after - key 
       || after - key < 0) 
       && key - before > 0 ? before : after;

答案 2 :(得分:4)

迭代所有键,找到与目标键差异最小的键。

以下是一些代码:

public static Long nearestKey(Map<Long, Object> map, Long target) {
    double minDiff = Double.MAX_VALUE;
    Long nearest = null;
    for (long key : map.keySet()) {
        double diff = Math.abs((double) target - (double) key);
        if (diff < minDiff) {
            nearest = key;
            minDiff = diff;
        }
    }
    return nearest;
}

当目标是一个大的负数并且地图键是一个大的正数时,所有转换为double的目的是防止翻转

答案 3 :(得分:1)

解决方案:

  1. 如果要按排序顺序将值插入hashMap,则可以使用LinkedHashMap,以便维护插入顺序。

  2. 现在我们可以对密钥执行二进制搜索,而不是遍历所有密钥(例如在其他一些答案中)。

  3. 如果对所有键进行迭代进行n次比较,则二进制搜索将使用log(n)进行基础2比较。

  4. 这里需要注意的是,只有在对地图进行排序时,这才有效。

    差异图的比较:

    • 哈希映射可以作为通用映射实现 提供快速存储和检索操作。然而,它下降了 因为条目的混乱和不规则安排而缩短。

      这会导致它在有很多情况下表现不佳 迭代,因为底层数组的整个容量会影响 遍历除了条目数之外的其他内容。

    • 链接的哈希映射拥有哈希映射和添加的良好属性 订购条目。它在很多地方表现得更好 迭代,因为只考虑了条目数 无论能力如何。
    • 树形图通过提供完整性将订购提升到下一个级别 控制如何对键进行排序。另一方面,它 提供比其他两种替代方案更差的一般性能。

    我们可以说链接的哈希映射减少了哈希映射排序中的混乱,而不会导致树映射的性能损失。

答案 4 :(得分:0)

哈希(包括HashMap)没有排序(实现'Comparable'),它们只使用equals()和hashCode()的实现。

换句话说,它无法完成。您可以尝试使用有序列表或设置。

答案 5 :(得分:0)

不?这不是get函数应该如何工作的。 我猜你可以使用TreeMap并使用getHeadMap / getTailMap并使用一些逻辑来找到最接近的匹配。但这可能需要摆弄一下。 毕竟最接近的意味着什么呢? ...