从已排序的 ArrayList 中删除重复项,同时保留重复项中的某些元素

2024-05-02

好吧,一开始我以为这会很简单。但我想不出有效的方法来解决这个问题。我想出了一种蛮力的方法来解决这个问题,但这不是很优雅。我有一个数组列表。 Contacts 是一个 VO 类,有多个成员 - 名称、区域、id。 ArrayList中存在重复项,因为不同的区域出现了多次。该列表按 ID 排序。这是一个例子:

条目 0 - 姓名:约翰·史密斯;地区:N;身份证号码:1
条目 1 - 姓名:约翰·史密斯;地区:MW;身份证号码:1
条目 2 - 姓名:约翰·史密斯;地区:S;身份证号码:1
条目 3 - 姓名:Jane Doe;区域:空;编号:2
第 4 条 - 姓名:杰克·布莱克;地区:N;编号:3
第 6 条 - 姓名:杰克·布莱克;地区:MW;编号:3
条目 7 - 姓名:Joe Don;地区:东北;编号:4

我想通过将相同 ID 的重复区域组合在一起来将列表转换为下面的列表。因此,最终列表应该只有 4 个不同的元素以及区域组合。

所以输出应该是这样的:-

条目 0 - 姓名:约翰·史密斯;区域:N、MW、S;身份证号码:1
条目 1 - 姓名:Jane Doe;区域:空;编号:2
条目 2 - 姓名:Jack Black;地区:N、MW;编号:3
条目 3 - 姓名:Joe Don;地区:东北;编号:4

您对解决这个问题的最佳方法有何看法?我不是在寻找实际的代码,而是寻找完成它的最佳方法的想法或技巧。

谢谢你的时间!!!


您可以在将它们转储(并合并重复项)到 TreeMap 时迭代它们。然后从 TreeMap 值的排序视图创建一个列表。

在示例代码中,我假设您有一个带有 id、名称和区域字段的 Entry 类,最后一个字段是区域实例列表。这可以很容易地更改为集合,区域更改为字符串或您正在使用的任何内容。该示例在将条目插入映射之前复制条目,因为它们在合并到其他条目时会被修改。

SortedMap<Integer, Entry> mergedEntriesMap = new TreeMap<Integer, Entry>();
for (Entry e : entries) {
  if (mergedEntriesMap.contains(e.id)) {
    Entry m = mergedEntriesMap.get(e);
    m.regions.addAll(e.regions);
  } else {
    Entry m = new Entry();
    // copy the entry to keep the original array clean
    m.id = e.id;
    m.name = e.name;
    m.regions = new ArrayList<Region>(e.regions);
    mergedEntriesMap.put(m.id, m);
  }
}

List<Entry> mergedEntries = new ArrayList<Entry>(mergedEntriesMap.values());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从已排序的 ArrayList 中删除重复项,同时保留重复项中的某些元素 的相关文章

随机推荐