2012-08-07 76 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