java - 从排序的 ArrayList 中删除重复项,同时保留重复项中的一些元素

标签 java arraylist

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

条目 0 - 姓名:John Smith;地区:N;编号:1
条目 1 - 姓名:John Smith;地区:兆瓦;编号:1
条目 2 - 姓名:John Smith;地区:S;编号:1
条目 3 - 姓名:Jane Doe;区域:NULL;编号:2
条目 4 - 姓名:Jack Black;地区:N;编号:3
条目 6 - 姓名:Jack Black;地区:兆瓦;编号:3
条目 7 - 姓名:Joe Don;地区:东北;编号:4

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

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

条目 0 - 姓名:John Smith;地区:北、中、南;编号:1
条目 1 - 姓名:Jane Doe;区域:NULL;编号:2
条目 2 - 姓名:Jack Black;地区:北部、中西部;编号:3
条目 3 - 姓名:Joe Don;地区:东北;编号:4

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

感谢您的宝贵时间!!!

最佳答案

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

在示例代码中,我假设您有一个带有 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());

关于java - 从排序的 ArrayList 中删除重复项,同时保留重复项中的一些元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2405073/

相关文章:

Java 休息客户端 : jax-rs & automatic type mapping

java - ArrayList作为函数的参数,却未能传递出去?

java - 使用插入排序比较 ArrayList 中的对象

java - 在 arraylist for 循环中执行 Collections.swap() 是否安全?

java - 使用嵌套 for 循环查找重复项

java - 单击按钮后如何动态添加文本字段?

java - session 过滤器上的 NPE

java - 在重写后使用 Object 的 hashCode() 和 equals() 实现

java - 使用列表参数调用存储过程

java - 使用 HashMap 或其他方法对 ArrayList 求和