2012-04-20 11 views
0

に設定し、私は、データ構造の以下のタイプの私の知識を1として地図と私の現在のプロジェクトでのJava

Map<String, Map<String,Set<String>>, Set<subscriber>> 

を必要とし、Javaがデータ構造のこの種類をサポートしていません(私が間違っている場合には親切に私を修正) 。または(「どのようにしてこのデータ型のJavaでデータ構造を実現できますか?

上記のデータ構造と操作をサポートするサードパーティのライブラリはありますか?

+2

このデータ構造で何をしたいかについてもう少し説明できますか?マップにはキーと値があるので、3番目のパラメータは何ですか? – Alex

+0

Map >、セット>これは、データ構造が多値であることを意味します。最初の2つの引数はキーです。 – Pankesh

+0

あなたの機能要件を記述すると良いでしょう、問題はあなたがしようとしているデザインにあるように見えます –

答えて

2

あなたが本当にあなたのデータ構造のキーとして機能するようにマップをしたい場合は、私は、これはあなたが欲しいものだと思う:あなたがためにカスタムペアクラス内の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; 

は注意これが適切に動作するようにします。

+2

ああ神よ、そうじゃない。 'Map'の中で可変オブジェクトをキーとして使うことは、' equals() 'と' hashCode() 'をオーバーライドしても非常に悪い考えです。 –

+0

彼は最初の2つの議論を鍵にして欲しいと言った。それは私が彼に与えたものだ。 – Alex

+0

@BrianRoachポイントはよく取られ、それに応じてコードが変更された。 – Alex

4

マップはkey/valueオブジェクトです。したがって、Map<String, Map, Set>を開始することはできません。

+3

これはOPが言っていることです_私の知る限り、Javaはこの種のデータ構造をサポートしていません_ –

4
可能な解決策が家にあなたの情報をすべてのオブジェクトを作成し、キー Stringで地図を作ることであろう

と値CustomObject

1

なぜ:

Map<String, Object[]> 

、その後、2の長さを作成しますあなたのMap<String,Set<String>>Set<subscriber>

を保持するオブジェクト配列は、それはハッキングのビットだが、それは解決

です

EDIT:私はカスタムオブジェクトのアイデアが好きです。

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クラスは単純な例である、あなたを:あなたはラッパークラスを記述し、あなたの地図でそれを使用する必要があると思いますので、

+0

役立つ入力がありませんそこ。この目的のために一般的なものとカスタムメイドのもののペアタイプを使用しないでください。 – yshavit

3

Javaは、単純な「ペア」クラスを提供していません

編集の追加:私はこれを投稿したときにあなたの質問の下にコメントを追加しました。あなたはそれを答えとして受け入れても、の2つのキーを探しています。どのように問題に近づいているのか考え直すことをお勧めします。アレックスは彼の例であなたがこれをしなければならない方法を示しています。 Mapで変更可能なデータをキーとして使用すると、コンテンツが変更された場合に多くの問題が発生する可能性があります。それを防ぐためにequals()hashCode()を実装することは、しばしば些細なことではありません。

+0

ああ、あなたの知恵を共有してください。(明らかに誰かがインターネットに傷ついている) –

+0

合意したように、マップを別のマップのキーとして使用したいという事実は非常に珍しく、問題空間を完全には理解していないか、たぶん、あなたはこれを2つのマップやそれらの線に沿ったものに戸惑うのが良いでしょう。 – Alex

関連する問題