【问题标题】:Retrieving specific values in Multimap在 Multimap 中检索特定值
【发布时间】:2012-08-07 19:12:48
【问题描述】:

我正在使用每个键有两个值的 Multimap。下面是我用来分别获取每个值的代码:

第一位代码获取第一个对象值:

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

然后,我使用另一种方法来检索另一个值。此方法将第一个对象作为参数:

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

这似乎是一种“hackish”的做事方式,那么有什么方法可以让我更轻松地获取这些值吗?

【问题讨论】:

  • 请注意:只要有可能(应该是大部分时间),您应该在代码中使用 ListMultimapSetMultimap 类型,而不是 Multimap 类型本身(类似于就像您通常想使用ListSet,而不是Collection)。听起来您几乎肯定应该在这里使用ListMultimap

标签: java guava


【解决方案1】:
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

【讨论】:

  • 我可能弄错了,但我认为你有额外的下一个(values.iterator() 应该指向第一个元素)
  • @Wug: values.iterator() 将指向第一个对象,但要访问指向的对象需要调用next(),它将返回指向的对象并推进迭代器。
  • 我能够迭代到第一个元素,但我无法迭代到下一个元素,因为我无法添加另一个 next()。
【解决方案2】:

如果您使用 Guava,Iterables#get 可能就是您想要的 - 它从任何可迭代对象中返回第 N 个项目,例如:

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

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

如果您使用的是 ListMultimap,那么它的行为非常类似于 List 的映射,因此您可以直接调用 get(n)

【讨论】:

    【解决方案3】:

    要获取同一个键的所有值,最简单的方法是:

        Iterator iterator = multimap.get(key).iterator();
        System.out.println("first element: " + iterator.next());
        System.out.println("second element: " + iterator.next());
        System.out.println("third element: " + iterator.next());
    

    等等

    另一种选择如果您想在不知道有多少元素的情况下获取所有元素

      Iterator iterator = multimap.get(key).iterator();
       int index=1;
       while (iterator.hasNext()) {
        System.out.println(index +" element: " + iterator.next()); 
         index++;
            }
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多