現在のプロジェクトでは、次のタイプのデータ構造が必要です
Map<String, Map<String,Set<String>>, Set<subscriber>>
私の知る限り、Javaはこの種のデータ構造をサポートしていません(間違っている場合は訂正してください)。または(「Javaでこのデータ型のデータ構造を実現するにはどうすればよいですか」と提案できます)。
上記のデータ構造と操作をサポートするサードパーティのライブラリはありますか?
マップはkey/value
オブジェクトであるため、開始する必要はありませんMap<String, Map, Set>
。
考えられる解決策は、すべての情報を格納するオブジェクトを作成してから、キーString
と値を使用してマップを作成することです。CustomObject
Javaは単純な「ペア」クラスを提供しないため、ラッパークラスを記述して、マップで使用する必要があります。
class Wrapper {
public Map<String,Set<String>> myMap = new HashMap<String,Set<String>>();
public Set<Subscriber> mySet = new TreeSet<Subscriber>();
}
Map <String, Wrapper> myMapOfWrappers = new HashMap<String, Wrapper>();
(Wrapper
ここでのクラスは単純な例です。ユースケースに応じてゲッター/セッターなどを提供できます)
編集して追加:あなたは私がこれを投稿したのと同時にあなたの質問の下にコメントを追加しました。あなたはそれを答えとして受け入れましたが、あなたのコメントはあなたが2つの鍵を探していると言っています。問題への取り組み方を再考することをお勧めします。アレックスは彼の例であなたがこれをしなければならない方法を示しています。可変データをキーとして使用するとMap
、内容が変更された場合に多くの問題が発生する可能性があります。これは、彼のすべてのコードが妨げていることです。とを実装してequals()
それhashCode()
を防ぐことは、多くの場合簡単ではありません。
マップをデータ構造のキーとして機能させたい場合は、次のようにする必要があります。
static Map<String,Set<String>> makeUnmodifiable(Map<String,Set<String>> m) {
Map<String,Set<String>> map = new HashMap<String,Set<String>>();
for (Map.Entry<String,Set<String>> entry : m.entrySet()) {
map.add(entry.getKey(), Collections.unmodifiableSet(entry.getValue()));
}
return Collections.unmodifiableMap(map);
}
static class Pair {
final String first;
final Map<String,Set<String>> second;
Pair(String first, Map<String,Set<String>> second) {
this.first = first;
this.second = second != null ? makeUnmodifiable(second) : null;
}
public void equals(Object o) {
...
}
public int hashCode() {
...
}
}
Map<Pair,Set<Subscriber>> myMap;
これが正しく機能するためには、カスタム Pair クラスで equals と hashCode をオーバーライドする必要があることに注意してください。
なぜだめですか:
Map<String, Object[]>
次に、2つの長さのオブジェクト配列を作成しMap<String,Set<String>>
てSet<subscriber>
ちょっとしたハックですが、解決策です
編集:私はカスタムオブジェクトのアイデアが好きです、はるかに良く、よりタイプセーフです!