1

タイプの Java HashMap があり<MyType,Double>ます。このMyTypeクラスには、( fooString 型の) およびbar(Double 型の) 2 つのフィールドがあります。equals および hashcode メソッドは、MyType使用専用fooです。Aタイプのオブジェクトが与えられたMyTypeので、ハッシュマップから一致するエントリを取得する必要があります。それが意味することは

MyType A = new MyType();
A.foo = "foo";
A.bar = 0.0;

MyType B = new MyType();
B.foo = "foo";
B.bar = 1.0;

Map<MyType,Double> myMap = new HashMap<MyType,Double>();
myMap.put(B,5.0)

Bキー(および最終的にはそのバーの値)を(それらの値が同じであるため)myMapとの等価性に基づいて抽出する必要があります。つまり、次の形式の関数です。Afoo

Double getBar(MyType type,  Map<MyType,Double> map)

そのような

getBar(A,myMap) returns 1.0 

それを行う最善の方法は何ですか?そもそもこれがどのように設計されているかはよくわかりませんが、myMap非常に巨大になることが予想されるため、これを行う効率的な方法を探しています.

更新: ここでの少し大きなコンテキストはこれです。MyType オブジェクトのセットがあります (S とします)。外部関数がそれに作用し、myMap と呼ばれる HashMap を作成します。この HashMap は、Double 型の数量を計算し、セット内の各オブジェクトに関連付けます。また、セット内の各オブジェクトのバー フィールドも更新します。返されるのは myMap です。次に、元のセット S の各要素を更新して、各要素のバーの値が、返された myMap の対応するエントリのバーの値に置き換えられるようにする必要があります。したがって、SI の各 A に対して、myMap の対応する B を読み取り、そのバーを取得してから、A のバーを B のバーと同じになるように設定する必要があります。

4

3 に答える 3

2

WhateverをそのFooで検索する必要がある場合は、 を使用する必要Map<Foo, Whatever>があります。それ以外のものは、せいぜい、 ではないものを に押し込もうとするハックになりMapますMap

しかし要点は、Mapインターフェイスは、使用しようとしている方法で使用するように設計されていないということです。入力したキーのみに基づいてを検索することを目的としています。強制的にそのように動作させることもできますが、せいぜい、正しく行うよりもおそらく難しい、保守不可能で厄介なハックになるでしょう。まず始めに。

ほとんどの場合、 aと a のMap<String, MyTypeAndDouble>両方を含むカスタム クラスに a を使用する必要があるようです。MyTypeDouble

于 2012-08-17T19:27:07.587 に答える
0

hashCodeandequalsに基づいて実行する場合foo(これは、実行していることを示しています)、例ABは、ハッシュマップの同じバケットになります。
結果としてgetBar(A,myMap);返さ5.0れるのは、それが map- に入れたものであるためですB。私はあなたが使用して
検索できることを意味しますが、それぞれが前のものを置き換えることになり、あなたのOPからあなたの実際の要件が何であるかわかりません BAput

アップデート:

Double getBar(MyType type,  Map<MyType,Double> map){  
    if(map.containsKey(type)){   
         for(MyType k:map.keySet()){  
              if(k.equals(type)){  
                 return k.bar;  
              }
         }
    }
    return -1.0;
}

更新 2:必要なのは、直接
キーにアクセスする方法のようです。Map次のように使用できます

class Holder{  
    MyType type;  
    Double value;  
}

代わりに持っていHashMap<MyType,Holder>ます。したがって、計算を行うメソッドでは、マップを更新して、結果をHolderオブジェクトに追加しますtypemyMap.put(B,5.0);つまり、あなたの代わりに:myMap.put(B,new Holder(B,5.0));

したがって、次のようになります。

Double getBar(MyType type,  Map<MyType,Holder> map){   
     return map.get(type).type.bar;    
}    

マップの値の一部としても保存するための余分なスペースが必要ですが、現在のようtypeに実際に見つけるためのループを取り除くことができますtype

于 2012-08-17T19:25:01.877 に答える
0

これはきれいではなく、マップを反復処理する必要がありますが、説明しているシナリオでバーの値を取得する必要があります。(これは、equals() メソッドが記述どおりであり、オブジェクトの等価性を判断するために foo の値のみを調べていることを前提としています)。

public Double getBar(MyType type,  Map<MyType,Double> map) {
  for (MyType entry : map.keySet()) {  
    if (entry.equals(type)) {
      return entry.getBar(); // or whatever your accessor is for bar
    } 
  }
  return null;  // or whatever value you want to return if it doesn't find a key
}
于 2012-08-17T20:11:58.230 に答える