2 つの着信文字列属性に基づいて列挙型の値を取得する必要があります。私はこれを単一の値のマップとして行ってきました。今、連結を行うことに直面しています。私ができるようにマップに2つのキーを持たせる方法はありますか
Map.get("attr1","attr2");
これは正しい列挙型を返します。それとも、考えられるすべての値を連結して、これをキーとして使用する必要がありますか?
きしむようなきれいな解決策を探しています(私たち全員ではありませんか:P)
2 つの着信文字列属性に基づいて列挙型の値を取得する必要があります。私はこれを単一の値のマップとして行ってきました。今、連結を行うことに直面しています。私ができるようにマップに2つのキーを持たせる方法はありますか
Map.get("attr1","attr2");
これは正しい列挙型を返します。それとも、考えられるすべての値を連結して、これをキーとして使用する必要がありますか?
きしむようなきれいな解決策を探しています(私たち全員ではありませんか:P)
まあ、あなたは使うことができますMap<String, Map<String, YourEnum>>
。
Map
これを頻繁に使用するため、 2 つのキーを提供し、内部で map-of-maps アプローチを使用する独自の実装を作成しました。
マップのマップ、つまり
Map.get("attr1").get("attr2");
または、equals メソッドを使用してオブジェクトを定義することもできます。つまり、
Map.get(new MyObject("attr1", "attr2"));
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;
}
この場合、これらの 2 つの属性を持つラッパー クラスを作成し、複合キーの 2 つの要素を実装equals()
し、おそらく実装Comparable
してcompareTo
委任します。そして、このクラスをマップのキーとして使用します。
自分のPair
クラスを展開するようなものです。この問題について詳しく説明しているこの質問の回答を見てください: Java の C++ ペアに相当するものは何ですか?
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.
トーマスのアプローチと同様に、私たち (私の仕事) には、複数のマップの単純なラッパーである「次元」マップ クラスがあります。
public class MultiKeyMap {
private HashMap<keyOne, Object> keyOneToObjectMap;
private HashMap<keyTwo, Object> keyTwoToObjectMap;
...etc
}
すべてのマップを相互に同期させるのは非常に簡単で、潜在的に複雑なコードを大量に使用することなく、適切に迅速な検索を行うことができます。(ただし、これにはメモリ使用量の増加という代償が伴います)