【问题标题】:How to conditionally insert a Map into a list in Java if the list does not already include a map containing a key value pair如果列表尚未包含包含键值对的映射,如何有条件地将映射插入 Java 中的列表
【发布时间】:2020-11-25 03:10:02
【问题描述】:

我有一个 Java 中的 HashMap 对象列表。 如果列表尚未包含具有与新 HashMap 中相同的键值对的 HashMap,我想有条件地向该列表添加更多 HashMap 对象。

这是一个示例 HashMap 列表。请注意,实际上,还有更多的键。在这里,为了简单起见,我只包括“contact_id”。

[{contact_id=16247115}, {contact_id=16247116}, {contact_id=16247117}, {contact_id=16247118}, {contact_id=16247119}]

不应允许将{contact_id=16247117} 添加到此列表中。 应该允许添加{contact_id = 74857983}

理想情况下,我希望能够在一行代码中有条件地将多个 HashMap 添加到此列表中。如果我不执行条件检查,我可以使用语法listname.addAll(batchOfHashMaps)。我想做类似的事情,但排除列表中多余的 HashMap。

在 Java 中实现这种条件插入最有效的方法是什么?

我认为必须有一个比在 for 循环中评估列表中的每个元素更有效的解决方案。

【问题讨论】:

  • 您说实际上 HashMap 包含更多键,但您也说仅当列表不包含具有“相同键值对”的列表时才要添加 HashMap。您的重复检查策略是基于列表中的 2 个具有 no 共同键值对的 HashMap,还是仅与 contact_id 相关的这一对?
  • 如果所有映射都必须匹配,您可以简单地使用HashSet
  • 你究竟是如何确定 HashMap 相等性的?
  • 就像ajc2000 建议的那样,我的重复检查策略是基于列表中具有相同contact_id 的2 个HashMap。其他键可以有不同的值。
  • @GNG。听起来你想要一张地图或一组,而不是一个列表。订单相关吗?如果是这样,哪个顺序?键还是插入?

标签: java arrays list hashmap duplicates


【解决方案1】:

如果您只想查看映射的一个键值对作为标识符,那么您可以使用 Map 而不是 List 来保存所有内容。例如, 地图 mapOfMaps;

然后你可以添加一个像:

mapOfMaps.putIfAbsent(mapToAdd.get("contact_id"), mapToAdd);

你可以添加多个喜欢:

batchOfHashMaps.forEach(m -> mapOfMaps.putIfAbsent(m.get("contact_id"), m));

要获取地图集合,只需调用 values()

mapOfMaps.values();

【讨论】:

  • 您可以使用带有自定义比较器的集合
猜你喜欢
  • 1970-01-01
  • 2023-02-25
  • 2020-08-10
  • 1970-01-01
  • 2021-12-31
  • 2022-08-22
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多