2016-08-12 47 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連接到23連接到7。我想要獲取所有通過連接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一些鍵包含多個整數 – apemanzilla

+0

沒錯,但是,你寫的是鍵表示連接,所以如果你在這裏使用pair會更好。另外,這些元素的列表是什麼意思? – carbolymer

回答

0

如果您使用Java 8或更新版本,則可以使用此流。

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

這個例子將產生所有那些在他們的關鍵1值的列表,但它可以很容易地進行修改,以做那些與1212,或任何你想要的東西。這裏有一個會做12

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

您的multimap中的關鍵其實並不代表一個連接ID,但連接ID的列表。

你有什麼:

{[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)嗎?數字可以與字符串關聯,數字可以相互關聯,對嗎?我們可以跟蹤不同數據結構中的每種類型的關聯。例如可以使用'Multimap 來跟蹤第一種類型,而可以使用'BiMap '或'Graph '來跟蹤後一種類型。 – mfulton26