我想在hashmap中搜索一个键,找到离该键最近的一个键!
HashMap<Long, Object> map = new HashMap<Long , Object>();
所以基本上我想搜索一个长的,如果它在地图中不存在,找到最接近的那个长值! 我怎么能这样做??
提前完成
答案 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)
如果要按排序顺序将值插入hashMap,则可以使用LinkedHashMap,以便维护插入顺序。
现在我们可以对密钥执行二进制搜索,而不是遍历所有密钥(例如在其他一些答案中)。
如果对所有键进行迭代进行n次比较,则二进制搜索将使用log(n)进行基础2比较。
这里需要注意的是,只有在对地图进行排序时,这才有效。
哈希映射可以作为通用映射实现 提供快速存储和检索操作。然而,它下降了 因为条目的混乱和不规则安排而缩短。
这会导致它在有很多情况下表现不佳 迭代,因为底层数组的整个容量会影响 遍历除了条目数之外的其他内容。
我们可以说链接的哈希映射减少了哈希映射排序中的混乱,而不会导致树映射的性能损失。
答案 4 :(得分:0)
哈希(包括HashMap)没有排序(实现'Comparable'),它们只使用equals()和hashCode()的实现。
换句话说,它无法完成。您可以尝试使用有序列表或设置。
答案 5 :(得分:0)
不?这不是get函数应该如何工作的。 我猜你可以使用TreeMap并使用getHeadMap / getTailMap并使用一些逻辑来找到最接近的匹配。但这可能需要摆弄一下。 毕竟最接近的意味着什么呢? ...