3

嗨,我有一个HashMap<String, Double>和一个函数,它返回一个双精度值,称为answer. 我想检查 HashMap 中的哪个值最接近答案,然后获取该值的键并打印它。

HashMap<String, Double> output = new HashMap<String, Double>();


contents
("A", 0)
("B", 0.25)
("C", 0.5)
("D", 0.75)
("E", 1)

假设我的一个函数的答案是 0.42,我如何检查它最接近哪个值,然后获取该值的键。我无法切换 HashMap 的键和值(因为前面的函数将值平均分配给每个字母),否则最好遍历每个键并获取值。

4

4 回答 4

8

如果您的值是唯一的,则可以使用TreeMap,它实现了NavigableMap,它具有 niceceilingKeyfloorKey方法:

    NavigableMap<Double, String> map = new TreeMap<>();
    map.put(0d, "A");
    map.put(0.25, "B");
    map.put(0.5, "C");
    map.put(0.75, "D");
    map.put(1d, "E");

    double value = 0.42;
    double above = map.ceilingKey(value);
    double below = map.floorKey(value);

    System.out.println(value - below > above - value ? above : below); //prints 0.5

注意:如果value小于(或大于)最小/最大键,两种方法都可以返回 null。

于 2013-03-12T22:49:26.867 回答
4

使用 a HashMap,您必须遍历每个条目。

但是,如果性能很重要并且您将通过这种方式找到多个条目,您可以创建另一个集合:哈希映射中的条目列表或数组,按值排序。然后,您可以进行二进制搜索以更有效地找到具有最接近值的条目,并返回键。当然,如果您只打算在每张地图上执行一次,那也无济于事......

于 2013-03-12T22:30:33.057 回答
0

HashMap 不是执行此操作的最佳结构。您可以获取 output.keySet() 并检查每个值,例如:

for(String key:output.keySet()){
   Double temp=Math.abs(output.get(key)-answer);
   if(temp<min){
     min=temp;
     nearest=key;
   }
}

但这不是最好的方法。你被迫使用哈希图?顺便说一句,如果您总是有五个答案要检查,这不是问题...

于 2013-03-12T22:40:52.393 回答
0

“最接近”的概念对于散列数据结构并没有真正意义。高效散列算法的主要目标是避免碰撞,这与接近性直接相反。要么你有碰撞,要么没有。

如果您要求这是一个有序的关键数据结构(例如TreeMap),答案会有所不同。

于 2013-03-12T22:30:52.717 回答