【问题标题】:Getting all objects with same key from a MultiValueMap从 MultiValueMap 获取具有相同键的所有对象
【发布时间】:2015-04-01 18:46:01
【问题描述】:

我有一个MultiValueMap<Integer, Path>,我试图从中获取 [print for this question] 使用相同的键放置在地图中的所有路径。

这是我目前的解决方案:

MultiValueMap<Integer, Path> duplicates = duplicateFinder.getDuplicates();

for (Map.Entry<Integer, Object> entry: duplicates.entrySet()) {
  final Integer key = entry.getKey();
  final Object obj = entry.getValue();
  for (Object o: (LinkedList)((ArrayList)entry.getValue()).get(0))
    System.out.println(o);
  System.out.println();
}

我觉得我的解决方案很危险(施法和幻数 0)并且想避免它。 如何以更易读/更安全的方式实现预期结果?

【问题讨论】:

  • @SotiriosDelimanolis 错误:(35, 41) java: 不兼容的类型: java.lang.Object 无法转换为 java.util.List
  • 未声明为MultiValueMap&lt;Integer, Path&gt; 是什么意思? decleration 显示在我的代码清单的第一行。
  • @SotiriosDelimanolis:我同意这是有道理的,但这不是 API 文档似乎支持的内容。
  • 我发现了错误。它在程序的其他地方。 MultiValueMap&lt;Integer, Path&gt; 被填充为 LinkedLists,其中包含 Paths 而不是 Paths。我觉得很奇怪,它不能确保我尝试放入的任何内容都是Path
  • @Pétur 这是因为他们莫名其妙地实现了Map;他们无法实现Map&lt;K, V&gt;,因为这样一个条目将是Entry&lt;K, V&gt;。他们无法实现Map&lt;K, Collection&lt;V&gt;&gt;,因为put 方法需要Collection&lt;V&gt; 而不是V,所以为了解决这个问题,他们已经实现了Map&lt;K, Object&gt;,这消除了任何机会类型安全。看来您应该改用 Guava 版本。

标签: java apache-commons apache-commons-collection


【解决方案1】:

条目集似乎是用一个不幸的签名声明的。但是您可以改为遍历键,并为每个键调用 getCollection

for (Integer key : duplicates.keySet()) {
    Collection<Path> paths = duplicates.getCollection(key);
    System.out.println("Paths for " + key);
    for (Path path : paths) {
        System.out.println("  " + path);
    }
    System.out.println();
}

(请注意,Guava 的 Multimap 将允许您改用 duplicates.asMap().entrySet(),并且每个条目都有一个 Collection&lt;V&gt; 作为值...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 2016-03-13
    相关资源
    最近更新 更多