1

在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

4 回答 4

1

你应该检查Pair这样的对象P_and_h.containsValue(pair)

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

于 2013-08-05T11:54:14.010 回答
0

您应该使用Map#containsKey()

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

或者,通过相同的Pair

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

containsValue()推荐使用。因为,它不能利用散列(这是为键而不是它们的值完成的),它会给你一个糟糕的表现。更多信息在Map#containsValue()

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

于 2013-08-05T11:59:42.090 回答
0

由于该值是类型Pair,因此您应该搜索 aPair并将其作为参数传递给方法containsValue();您还应该覆盖hasCode()并且equals()如果您想找到“有意义”相等的对象,即包含相同字段的对象,在您的情况下是相同的HorseModifierand LivingEntity。否则,它仅检查您传递的引用是否引用了存在于 中的对象Map,而不考虑其字段。

于 2013-08-05T11:57:00.623 回答
0

太糟糕了,这是不可能的!

通过 instict 我会说Pair需要实现equals()containsKey不通过 usingequals()检查,它检查身份 using ==

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

  • 实现 HashMap 并覆盖containsKeyand containsValue
  • 或者甚至更好,创建您自己的地图。
于 2013-08-05T12:35:29.533 回答