2

重複の可能性:
複数のキーを持つマップを実装する方法は?
単一の値マップ Java への複数のキー

2 つの着信文字列属性に基づいて列挙型の値を取得する必要があります。私はこれを単一の値のマップとして行ってきました。今、連結を行うことに直面しています。私ができるようにマップに2つのキーを持たせる方法はありますか

Map.get("attr1","attr2");

これは正しい列挙型を返します。それとも、考えられるすべての値を連結して、これをキーとして使用する必要がありますか?

きしむようなきれいな解決策を探しています(私たち全員ではありませんか:P)

4

6 に答える 6

5

まあ、あなたは使うことができますMap<String, Map<String, YourEnum>>

Mapこれを頻繁に使用するため、 2 つのキーを提供し、内部で map-of-maps アプローチを使用する独自の実装を作成しました。

于 2011-09-27T14:23:11.867 に答える
3

マップのマップ、つまり

Map.get("attr1").get("attr2");

または、equals メソッドを使用してオブジェクトを定義することもできます。つまり、

Map.get(new MyObject("attr1", "attr2"));
于 2011-09-27T14:25:18.003 に答える
0

org.apache.commons.collections.map.MultiKeyMap はあなたが望むものです

http://commons.apache.org/collections/apidocs/org/apache/commons/collections/map/MultiKeyMap.html

 private MultiKeyMap cache = MultiKeyMap.decorate(new LRUMap(50));

 public String getAirlineName(String code, String locale) {
   String name = (String) cache.get(code, locale);
   if (name == null) {
     name = getAirlineNameFromDB(code, locale);
     cache.put(code, locale, name);
   }
   return name;
 }
于 2011-09-27T14:31:00.163 に答える
0

この場合、これらの 2 つの属性を持つラッパー クラスを作成し、複合キーの 2 つの要素を実装equals()し、おそらく実装ComparableしてcompareTo委任します。そして、このクラスをマップのキーとして使用します。

自分のPairクラスを展開するようなものです。この問題について詳しく説明しているこの質問の回答を見てください: Java の C++ ペアに相当するものは何ですか?

于 2011-09-27T14:24:43.050 に答える
0

2 つのキーを含むクラスを作成し、それをマップ キーとして使用してみませんか?

例えば:

public class BiKey implements comparable<BiKey>
{
  private String key1;
  private String key2;

  // getters and setters

  // equals and hash code.

  // implement comparable.
}

Map <BiKey, Blammy> blammyMap; // Blammy is the value type.
于 2011-09-27T14:26:23.513 に答える
0

トーマスのアプローチと同様に、私たち (私の仕事) には、複数のマップの単純なラッパーである「次元」マップ クラスがあります。

public class MultiKeyMap {
  private HashMap<keyOne, Object> keyOneToObjectMap;
  private HashMap<keyTwo, Object> keyTwoToObjectMap;
  ...etc


}

すべてのマップを相互に同期させるのは非常に簡単で、潜在的に複雑なコードを大量に使用することなく、適切に迅速な検索を行うことができます。(ただし、これにはメモリ使用量の増加という代償が伴います)

于 2011-09-27T14:29:27.553 に答える