簡體   English   中英

Hashmap 1鍵2值-使用containsValue

[英]Hashmap 1 key 2 values - using containsvalue

我在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)

您應該使用諸如P_and_h.containsValue(pair)這樣的Pair對象進行檢查。

containsValue()如果此映射將一個或多個鍵映射到指定值,則返回true。

由於該值的類型為Pair您應該搜索Pair並將其作為參數傳遞給containsValue()方法; 如果要查找“有意義地”相等的對象,即包含相同字段的對象(在您的情況下為相同的HorseModifierLivingEntity equals()則還應該重寫hasCode()equals() 否則,它僅檢查您傳遞的引用是否引用Map中存在的Object(無論其字段如何)。

您應該使用Map#containsKey()

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

或者,通過同一Pair

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

建議使用containsValue() 因為,它不能利用散列(這是針對鍵而不是鍵的值進行的),所以會給您帶來糟糕的性能。 有關更多信息,請參見Map#containsValue()

對於Map接口的大多數實現,此操作可能需要地圖大小中的時間線性。

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

通過提示,我會說Pair需要實現equals()但是containsKey不能通過使用equals()進行檢查,而是使用==來檢查身份。

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

  • 實現HashMap並覆蓋containsKeycontainsValue
  • 甚至可能更好,創建自己的地圖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM