【问题标题】:Java 8 filter List of Map objects based on Map property to remove some duplicatesJava 8 根据 Map 属性过滤 Map 对象列表以删除一些重复项
【发布时间】:2018-03-09 15:06:03
【问题描述】:

有一个

List<Map<String, Object>> allPoints = new LinkedList<>();

每个映射都包含一个带有字符串值的"name" 键; 需要创建一个

 List<Map<String, Object>> expectedPoints

列表中有重复的名字;对于这些,只想保留最后一个。

例如如果列表包含三个项目,并且第一个和第三个项目都具有值为“abc”的“name”,则结果列表应该只包含原始列表中的第二个和第三个项目。

【问题讨论】:

  • 所以你只想要唯一的键?没有重复?
  • 对这个问题一无所知。请添加更多信息并显示示例
  • 请提供一些您正在尝试做的事情的例子。问题不是很清楚。
  • @XtremeBaumer 但是如何填充集合,以便只放入最后一个重复的集合。

标签: java java-8


【解决方案1】:

一种方法是使用辅助地图:

Map<String, Map<String, Object>> map = new LinkedHashMap<>(allPoints.size(), 0.75f, true);
allPoints.forEach(point -> map.put((String)point.get("name"), point));

List<Map<String, Object>> expectedPoints = new ArrayList<>(map.values());

之所以有效,是因为Map.put 要么将新条目放入地图,要么用新条目覆盖现有条目的值,从而仅保留与名称关联的最后一个点。

我正在使用它的overloaded constructor 创建一个access-ordered LinkedHashMap。这是为了保持与allPoints 列表中相同的顺序。

【讨论】:

  • 工作正常...但是您是否阅读了 OP 写的最后一句话?我认为这个问题很混乱。
  • ArrayList(map.values())。您在那里缺少钻石操作员。
  • 不过,这会根据第一次看到密钥的时间来维护插入顺序。对于第 1 项和第 3 项具有相同名称的示例,这将首先返回第 3 项的列表。
  • @FedericoPeraltaSchaffner LinkedHashMapbuckets 的数量作为参数,而不是 elementsCHM 执行元素),所以更好说allPoints.size() / 0.75 + 1
  • @Eugene 我知道,感谢您的反馈。但我不想让构造函数进一步复杂化。此外,由于重复,地图的大小将小于列表的大小。所以,我预计地图的大小不会超过一次。
【解决方案2】:

如果您对一个或多个键值对有约束并且可以灵活地使用 Set,请编写您自己的比较器并在 LinkedList 上使用 descendingIterator 并写入 TreeSet。见以下代码:

        LinkedList<Map<String, Object>> allPoints = new LinkedList<>();

        Set<Map<String, Object>> expectedPoints = new TreeSet<>((objectMap1, objectMap2) ->
                objectMap2.get("name").equals(objectMap1.get("name")) ? 0 : -1
        );

        allPoints.descendingIterator().forEachRemaining(expectedPoints::add);

【讨论】:

  • 如果我用 1 或其他值替换 -1 会发生什么?很好的答案...
  • 项目的显示顺序将会改变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多