1

我有一个 Java HashMap 类型<MyType,Double>。该类MyType有两个字段foo(String 类型)和bar(Double 类型)。equals 和 hashcode 方法仅供MyType使用foo。现在给定一个A类型的对象,MyType我需要从 Hashmap 中获取匹配的条目。这意味着什么

MyType A = new MyType();
A.foo = "foo";
A.bar = 0.0;

MyType B = new MyType();
B.foo = "foo";
B.bar = 1.0;

Map<MyType,Double> myMap = new HashMap<MyType,Double>();
myMap.put(B,5.0)

我需要根据它与(因为它们的值相同)的相等性(即形式的函数)从中提取键B(最终是它的 bar 值)myMapAfoo

Double getBar(MyType type,  Map<MyType,Double> map)

这样

getBar(A,myMap) returns 1.0 

最好的方法是什么?我不太确定这个东西最初是如何设计的,但我正在寻找一种有效的方法来做到这一点,因为myMap预计它会非常庞大​​。

更新:这里有一个稍微大一点的上下文。我有一组 MyType 对象(比如 S)。一个外部函数在它上面工作并创建一个名为 myMap 的 HashMap,它计算 Double 类型的数量并将其与集合中的每个对象相关联。它还更新集合中每个对象的 bar 字段。我得到的是myMap。现在我需要更新原始集合 S 中的每个元素,以便将每个元素的 bar 值替换为返回的 myMap 中相应条目的 bar 值。所以对于SI中的每一个A都需要读取myMap中对应的B,得到它的bar,然后设置A的bar和B的bar相同。

4

3 回答 3

2

Whatever如果你需要通过它来查找a Foo,你必须使用a Map<Foo, Whatever>。其他任何事情充其量都是试图将不是 a 的东西推MapMap.

但关键是,该Map界面并非旨在按照您尝试使用它的方式使用。它的目的是仅根据您输入的来查找。您可能可以强制它以这种方式工作,但充其量您最终会得到一个无法维护、笨拙的 hack,这可能比正确地做事情更困难首先。

看起来您应该将 aMap<String, MyTypeAndDouble>用于一些同时包含 aMyType和 a 的自定义类Double

于 2012-08-17T19:27:07.587 回答
0

如果您执行hashCodeandequals基于foo(这是您指示您正在执行的操作),那么在您的示例中AB最终将位于哈希图中的同一个存储桶中。
结果getBar(A,myMap);会返回5.0,因为那是您在地图中放置的内容 - B
我的意思是您可以搜索BusingA但随后每个都put将替换前一个,我不确定您的 OP 中您的实际要求是什么

更新:

Double getBar(MyType type,  Map<MyType,Double> map){  
    if(map.containsKey(type)){   
         for(MyType k:map.keySet()){  
              if(k.equals(type)){  
                 return k.bar;  
              }
         }
    }
    return -1.0;
}

更新 2:
您似乎需要一种Map直接访问您的密钥的方法。您可以使用执行以下操作:
定义:

class Holder{  
    MyType type;  
    Double value;  
}

HashMap<MyType,Holder>而是拥有。因此,在您进行计算的方法中,您更新地图以将结果添加到Holder您还存储type. 即代替myMap.put(B,5.0);你做:myMap.put(B,new Holder(B,5.0));

所以你将拥有:

Double getBar(MyType type,  Map<MyType,Holder> map){   
     return map.get(type).type.bar;    
}    

您还需要额外的空间来存储type地图值的一部分,但是您将摆脱循环以实际找到type现在的

于 2012-08-17T19:25:01.877 回答
0

好吧,这并不漂亮,需要遍历 Map ,但它应该让你在你描述的场景中得到 bar 的值。(这假设您的 equals() 方法与您描述的一样,仅查看 foo 的值来确定对象相等性)。

public Double getBar(MyType type,  Map<MyType,Double> map) {
  for (MyType entry : map.keySet()) {  
    if (entry.equals(type)) {
      return entry.getBar(); // or whatever your accessor is for bar
    } 
  }
  return null;  // or whatever value you want to return if it doesn't find a key
}
于 2012-08-17T20:11:58.230 回答