2012-08-07 43 views
2

我正在使用每個鍵有兩個值的Multimap。下面是我使用單獨獲得每個值碼:在Multimap中檢索特定值

代碼的第一位得到的第一個對象值:

for(Object object : map.get(object)) 
{ 
    return object 
} 

然後,我用另一種方法來檢索其他值。此方法採用的第一個對象作爲參數:

for(Object object : team.get(object)) 
{ 
    if(object != initialObject) 
    { 
     return object; 
    } 
} 

這似乎是一個做事的「hackish的」方式,那麼有沒有什麼辦法讓我更輕鬆地獲得價值?

+1

剛一說明:只要有可能(這應該是大部分時間),你應該在代碼中使用了'ListMultimap'或'SetMultimap'類型,而不是'Multimap'類型本身(有點像你一般要使用'List'或'Set',而不是'Collection')。這聽起來像你應該幾乎肯定在這裏使用'ListMultimap'。 – ColinD 2012-08-08 02:21:05

回答

2
Collection<Object> values = map.get(key); 
checkState(values.size() == 2, String.format("Found %d values for key %s", values.size(), key)); 

return values.iterator().next(); // to get the first 

Iterator<Object> it = values.iterator(); 
it.next(); // move the pointer to the second object 
return it.next(); // get the second object 
+0

我也可能錯了,但我想你已經在那裏了額外的nextS(values.iterator()應指向第一個元素) – Wug 2012-08-07 19:33:31

+0

@Wug:'values.iterator()'將指向第一個對象,但訪問我們需要調用'next()',它將返回指向的對象並且推進迭代器。 – 2012-08-07 19:36:07

+0

啊哈。說得通。 – Wug 2012-08-07 19:38:41

5

如果您使用番石榴,Iterables#get可能是你想要的東西 - 它可迭代的,例如返回第N項:

Multimap<String, String> myMultimap = ArrayListMultimap.create(); 

// and to return value from position: 
return Iterables.get(myMultimap.get(key), position); 

如果您使用的是ListMultimap那麼它的表現非常非常類似於列表的地圖,因此您可以直接致電get(n)

+0

這也適用,謝謝! – Raggeth 2012-08-07 21:05:15