Hashmap 1键2值 - 使用containsvalue

时间:2013-08-05 11:50:52

标签: java hashmap

在stackoverflow中的某个地方,我找到了大约2个值的解决方案。

public class Pair<A, B> {
    A first = null;
    B second = null;

    Pair(A first, B second) {
        this.first = first;
        this.second = second;
    }

    public A getFirst() {
        return first;
    }

    public void setFirst(A first) {
        this.first = first;
    }

    public B getSecond() {
        return second;
    }

    public void setSecond(B second) {
        this.second = second;
    }

}

public static HashMap<Player, Pair<HorseModifier, LivingEntity>> P_and_h = 
      new HashMap<Player,Pair<HorseModifier, LivingEntity>>();;

问题是:

P_and_h.put(p, new Pair(hm, hm.getHorse()));

if(P_and_h.containsValue(HorseModifier))` - dont working ( this is first object)

4 个答案:

答案 0 :(得分:1)

您应该使用此Pair这样的P_and_h.containsValue(pair)对象进行检查。

  

containsValue()如果此映射将一个或多个键映射到指定值,则返回true。

答案 1 :(得分:0)

由于该值属于Pair类型,因此您应该搜索Pair并将其作为参数传递给方法containsValue(); 如果要查找“有意义”相等的对象,即包含相同字段的对象,在您的情况下,hasCode()和{{1},您还应该覆盖equals()HorseModifier }}。否则,它仅检查您传递的引用是否指向LivingEntity中存在的对象,而不管其字段如何。

答案 2 :(得分:0)

您应该使用Map#containsKey()

if (P_and_h.containsKey(p)) {
  // ...
}

或传递相同的Pair

if (P_and_h.containsValue(new Pair(hm, hm.getHorse()))) {
  // ...
}

建议使用containsValue() 。因为,它不能利用散列(对键而不是它们的值),它会给你带来糟糕的性能。有关详情,请访问Map#containsValue()

  

对于Map接口的大多数实现,此操作可能需要地图大小的线性时间。

答案 3 :(得分:0)

太糟糕了,这可能!

通过instict我会说Pair需要实现equals()containsKey不要使用equals()进行检查,它会使用==检查身份。

太糟糕了,你不能使用HashMap。

  • 实施HashMap并覆盖containsKeycontainsValue
  • 或者甚至可以更好地创建自己的地图。