【问题标题】:How do I get each of the entries from Guava MultiMap and their corresponding values associated with it?如何从 Guava MultiMap 中获取每个条目以及与之关联的相应值?
【发布时间】:2015-08-26 19:53:12
【问题描述】:

我正在读取一个包含重复条目的巨大 csv 文件。我能够将整个 csv 文件读入Multimap。我还能够获取具有重复值的键集并将它们写入文件。我想获取与每个键关联的值并将其写入文件但无法这样做。我似乎找不到任何可能对我有帮助的选项。我尝试使用根据the docentries() 方法

返回此多重映射中包含的所有键值对的视图集合,作为 Map.Entry 实例

但我无法从中得到任何东西。

我正在使用ArrayListMultiMap 实现MultiMap。使用ArrayList 的原因是稍后我需要执行在ArrayList 中更快的搜索操作。

我已将密钥集 p 存储为 MultiSet,这就是我能够获取所有重复密钥的原因。

每个键的值是一个对象,我想将其写入与该读取键对应的文件中。

【问题讨论】:

  • 你能edit 更清楚地说明:1. 你做了什么(最好用代码) 2. 你想做什么(最好用一个例子)。见:minimal reproducible example
  • 所以你已经得到了一个Multimap<FileName, ContentsToGoInFile> 并且你想要给定键的所有值以便你可以将它们放在一个文件中?
  • @Edd 更像是 Multimap。我已经能够将所有字符串(包括重复的字符串)作为键集获取,但现在想要获取与每个键关联的 SomeClassObject,最好同时获取,以便我可以将它们作为记录写入文件。

标签: java csv guava multimap


【解决方案1】:

如果您希望每个键和每个值与该键关联,而不是每个键值对,那么您可以这样做

for (Map.Entry<String, Collection<SomeClassObject>> entry : multimap.asMap().entrySet()) {
   String key = entry.getKey();
   Collection<SomeClassObject> valuesForKey = entry.getValue();
   // do whatever
}

【讨论】:

  • 感谢您的回复。它没有解决我的问题。这就是我的想法,并且很确定我错了,因为我已经这样做了 3 个小时而没有进展。只有说 10 个唯一键。这些键中的每一个都有与之关联的 1000 个值。现在,由于最终我想在包含相同数据的两个文件之间进行比较,因此我计划将每个值及其键创建一个列表。因此,我将最终收集 10 个 bis 列表。然后,我想比较它们,然后继续进行。这是我的用例。你认为我的想法正确吗?
  • 这没什么问题。我不明白你的问题出在哪里。
  • 我无法为每个唯一键获取这 1000 个值的列表。按照您的示例,在 valuesForKey 完全填充后,它会再次作为元素添加到更高的超级列表中吗?我选择什么样的收藏来实现这一目标?如果我尝试使用 ArrayList 执行某些操作,则会收到“内存不足”错误。
  • “它会再次作为元素添加到更高的超级列表中吗?”什么?这是你方法的一部分,还是你认为 Multimap 需要的东西? (不是。)向我们展示导致错误的代码。
  • 我现在的问题是,如果我使用您的代码,它只会拾取一个“条目”及其相应的值。因此,如果我总共有 10,000 条记录,我只会得到 2000 条与一个键相关联的信息。如果我在 while 循环中使用迭代器并用它遍历键集,它就会卡住。
【解决方案2】:

正如您所发现的,有两种方法可以考虑多重映射。一种是Map&lt;K, Collection&lt;V&gt;&gt;,另一种是Map&lt;K, V&gt;,其中的键不必是唯一的。在 the documentation 中,Google 强调后一种方法是首选,但如果您按照 Louis 的建议使用 multimap.asMap().entries()(注意不仅仅是 multimap.entries()),您将获得与前一个版本类似的条目。

对于您的特定问题,我不确定您为什么不能执行以下操作:

for (String key : multimap.keySet()) {
    Collection<SomeClassObject> values = multimap.get(key);
    //Do whatever with all the values for Key key...
}

【讨论】:

  • 如果我尝试这样做,那么它不会像提到的那样给我“每个”键的值。它只是拿起一个“键”并打印它的所有值。它不是按顺序开始的,只是选取一个随机值。如果 keyset 中的所有键都是唯一的,我肯定知道,那为什么它只选择一个键?
  • 我刚刚调试过,它确实读取了键集中的每个值,但它只保留最后一个键并显示与之关联的值。我说它正在获取一个随机密钥是错误的,而是它正在遍历每个条目但在它通过时删除它们,因此只保留最后一个。哪个集合可以保留所有条目,而不仅仅是最后一个?
  • 通读每个条目后,我将该列表添加到 Collection 的另一个 ArrayList 中,然后我能够获取每个键及其所有关联值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-22
  • 2018-01-06
  • 1970-01-01
  • 2017-06-11
  • 2018-12-29
  • 1970-01-01
  • 2018-10-01
相关资源
最近更新 更多