2016-11-03 3 views
-1

は、私は私がやりたいことはDrink.nameに渡された文字列を比較するハッシュマップのためのgetメソッドを持っているし、彼らがある場合はそうハッシュマップのキーと異なるパラメータを持つハッシュマップのコマンドを取得しますか?

// In the main function 
HashMap<Drink, boolean> drinkMap = new HashMap<>(); 

// What I would like to be able to do: 
drinkMap.get("beer"); 

// My drink Class which is used as the key 
public class Drink implements Comparable<String> { 
    private String name; 
    private String info; 

    public String getName() { 
     return Name; 
    } 

    public Drink(String name, String info) { 
     this.name = name; 
     this.info = info; 
    } 
} 

ように私のハッシュマップで私のキーとしてカスタムクラスを持っています同じものがhashmapエントリを返しますが、これを動作させる方法を理解することはできません。

私はそうのような私のドリンククラスのequalsとhashCodeメソッドを実装してみました:

@Override 
public int hashCode() { 
    return Name.hashCode(); 
} 

@Override 
public boolean equals(Object o) { 
    return o instanceof String && o.equals(Name); 
} 

をしかし、私はhashMap.get(「ビール」)を行うだろうというとき、それは私がそこに存在することがわかっているにもかかわらず、nullを返し保持しました地図で「ビール」という名前のオブジェクトを飲む。

+1

なぜあなたはキーとして名前を使用していませんか? – shmosel

+0

'HashMap'のソースを見るのに2分かかった場合、これは決してうまくいかないでしょう。それが明らかでない場合は、ステップデバッガは苦痛をなくします。 –

+0

あなたに完全に正直ではない理由はありません。ブール値がDrinkクラスの一部であるか、2つのマップを使用するように、リファクタリングすることができます。しかし、もしこれがうまくいくとすれば、それはよりシンプルに終わってしまうかもしれないと思った...そうではないことを認識し始めた。 –

答えて

0

これはひどい考えです。目的のキーと同じタイプ(またはそのサブタイプ)のマップを常に照会する必要があります。そうしないと、問題が発生するだけです(気づき始めたと確信しています)。

マップのキーをStringタイプにするか、Drinkで地図を照会するかを検討する必要があります。 (あなたの特定のケースが動作していない理由として。:"beer".equals(drink) != drink.equals("beer"))を

+1

最後の部分は本当に恐ろしい部分のIMOです。 – shmosel

関連する問題