2016-08-12 1 views
0

のは、我々はマルチマップ複合キーでマルチマップをソートする方法は?

Multimap<List<Integer>, String> map = HashMultimap.create(); 

map.put(asList(1), "a"); 
map.put(asList(1), "b"); 
map.put(asList(1), "c"); 
map.put(asList(2), "d"); 
map.put(asList(3), "e"); 
map.put(asList(3), "f"); 
map.put(asList(1), "g"); 
map.put(asList(1), "h"); 
map.put(asList(1), "i"); 
map.put(asList(1), "j"); 
map.put(asList(1), "k"); 
map.put(asList(1, 2), "l"); 
map.put(asList(1, 2), "m"); 
map.put(asList(1, 2), "n"); 
map.put(asList(1, 2), "o"); 
map.put(asList(3), "p"); 
map.put(asList(3), "q"); 
map.put(asList(3), "r"); 
map.put(asList(7,3), "s"); 
map.put(asList(7), "t"); 

マップのキーは、接続IDを表していることを仮定しましょう。 1はに接続され、37に接続されています。すべてのシンボルを接続IDでフィルタリングするには

1&2 : a,b,c,d,g,h,i,j,k,l,m,n,o 
7&3 : e,f,p,q,r,s,t 

グアバでどのようにすることができますか?

+1

なぜキーはリストですか?キーがIntegerであればずっと簡単です。 – carbolymer

+0

@carbolymerいくつかのキーには複数のintが含まれています – apemanzilla

+0

右のキーが接続を表していると書いてありますので、ここでペアを使用する方が良いでしょう。また、1つの要素を持つリストの意味は何ですか? – carbolymer

答えて

0

Java 8以降を使用している場合は、ストリームを使用できます。

List<String> ones = map.entries().stream() 
    .filter(entry -> entry.getKey().contains(1)) 
    .map(Map.Entry::getValue) 
    .collect(Collectors.toList()); 

この例では、そのキーに1を持っているすべての値でリストを生成しますが、簡単に1または212、またはあなたが望む何か他のものとものを行うように変更することができます。

List<String> onesAndTwos = map.entries().stream() 
    .filter(entry -> entry.getKey().contains(1) || entry.getKey().contains(2)) 
    .map(Map.Entry::getValue) 
    .collect(Collectors.toList()); 
+0

マップは 'stream'メソッドを持っていますか? – Finkelson

+0

@Finkelsonいいえ、その 'entrySet()'は行いません - 最初のコード行を見てください。しかし、これは問題ではありません。Java 8のすべての項目をループする、つまり効率が悪いという単純な方法です。 – maaartinus

1

あなたのマルチマップのキーは、実際に接続IDを表すものではありませんが、接続IDのリスト:ここで1または2を行います一つです。あなたが持っているもの

:私はあなたが必要だと思う何

{[1]=[a, b, c, g, h, i, j, k], [2]=[d], [3]=[p, q, r, e, f], [1, 2]=[l, m, n, o], [7]=[t], [7, 3]=[s]} 

{1=[a, b, c, g, h, i, j, k, l, m, n, o], 2=[d, l, m, n, o], 3=[e, f, p, q, r, s], 7=[s, t]} 

私はMultimap<Integer, String>代わりのMultimap<List<Integer>, String>を使用して、単純にお勧めします。

Multimap<Integer, String> multimap = ArrayListMultimap.create(); 
multimap.put(1, "a"); 
multimap.put(1, "b"); 
multimap.put(1, "c"); 
multimap.put(2, "d"); 
multimap.put(3, "e"); 
multimap.put(3, "f"); 
multimap.put(1, "g"); 
multimap.put(1, "h"); 
multimap.put(1, "i"); 
multimap.put(1, "j"); 
multimap.put(1, "k"); 
multimap.put(1, "l"); 
multimap.put(1, "m"); 
multimap.put(1, "n"); 
multimap.put(1, "o"); 
multimap.put(2, "l"); 
multimap.put(2, "m"); 
multimap.put(2, "n"); 
multimap.put(2, "o"); 
multimap.put(3, "p"); 
multimap.put(3, "q"); 
multimap.put(3, "r"); 
multimap.put(7, "s"); 
multimap.put(3, "s"); 
multimap.put(7, "t"); 
System.out.println("1 & 2 : " + ImmutableSet.copyOf(Multimaps.filterKeys(multimap, i -> 
     i == 1 || i == 2).values())); 
System.out.println("7 & 3 : " + ImmutableSet.copyOf(Multimaps.filterKeys(multimap, i -> 
     i == 7 || i == 3).values())); 

出力例:

1 & 2 : [a, b, c, g, h, i, j, k, l, m, n, o, d] 
7 & 3 : [e, f, p, q, r, s, t] 
+0

しかし、私は数字の間の接続を維持する必要があります。 '1 - > 2'、' 3 - > 7'など – Mark

+1

それは別の問題ではありません(https://en.wikipedia.org/wiki/Separation_of_concerns)?数字は文字列に関連付けることができ、数値は互いに関連付けることができます。私たちは、さまざまなデータ構造における関連の各タイプを追跡することができます。例えば'BiMap 'または 'Graph 'を使用して後者の型を追跡できる間に、 'Multimap 'を使って最初の型を追跡することができます。 – mfulton26

関連する問題