2013-08-05 63 views
1

某處在stackoverflow我找到解決方案關於2個值。HashMap 1鍵2值 - 使用containsvalue

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) 
+2

'containsValue'方法將檢查一個匹配的值,在這種情況下它是一個'Pair',而不是'HorseModifier'。並用小寫字母開始變量名稱。而且,你似乎正在用類名稱調用'containsValue'。 – keyser

+0

..因爲'Pair'沒有實現'equals',它只會在找到包含的值,如果它是完全相同的實例(=你不能創建另一個'new Pair(hm,hm.getHorse())'這是一個不同的實例) – zapl

+0

此外,它建議覆蓋equals類和hashCode(在這種情況下不需要,但不錯的做法)爲您的Pair類。 – rocketboy

回答

1

你應該Pair對象這樣P_and_h.containsValue(pair)檢查。

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

+0

我需要把(包含值)有兩個值來找到一個值? – user2652995

+1

@ user2652995既然你把一對放在那裏,是的。如果你想使用'HorseModifier'找到一對,你需要遍歷整個事物。一個更好的方法是將'HashMap ' – keyser

+0

@ user2652995作爲@Keyser告訴的。你在地圖上放置一個'Pair'。所以你檢查一下,然後才能得到正確的結果。 – Prabhaker

0

由於值是類型Pair你應該搜索Pair,並將其傳遞作爲方法containsValue()參數; 如果您想要找到「有意義」的相同對象,即包含相同字段的對象,則您應該也覆蓋hasCode()equals(),在您的情況下,您可以使用相同的HorseModifierLivingEntity。否則它只檢查您傳遞的引用是否指Map中存在的對象,而不考慮其字段。

0

您應該使用Map#containsKey()

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

,或者通過相同Pair

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

使用containsValue()建議。因爲它不能利用哈希(這是爲鍵而不是它們的值),它會給你一個可怕的表現。 Map#containsValue()

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

0

太糟糕了,這是不可能

通過instict我要說Pair需要實現equals()containsKey使用equals()不要檢查,它使用==檢查身份。

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

  • 執行HashMap並覆蓋containsKeycontainsValue
  • 或者甚至可能更好,創建自己的地圖。