【问题标题】:How to merge two ArrayLists without duplicates? [duplicate]如何合并两个不重复的 ArrayList? [复制]
【发布时间】:2013-05-07 08:50:42
【问题描述】:

我有两个数组列表

ArrayList one = {A, B, C, D, E}
ArrayList two = {B, D, F, G}  

我想要我的最终 ArrayList,它将包含 All 一个的元素以及只有两个而不是一个的元素。

所以 ArrayList final = {A, B, C, D, E, F, G}。

我该怎么做?

【问题讨论】:

  • 可以使用Set 吗?这要求您在列表一中的项目是唯一的。
  • 我对 Set 不熟悉。所以我不喜欢使用它。我的设备中有 Java 1.2。
  • 缺乏熟悉并不是回避优秀数据类型的理由。 Set 在 1.2 中可用。您必须回答的问题是:您是否希望在您的最终列表/集合中有 任何 个重复项?
  • @DuncanJones 不,我不希望在我的最终列表/集中出现任何重复项。你能告诉我如何使用 Set 来做到这一点
  • 至少one of the answers 已经向您展示了如何执行此操作。

标签: java arraylist


【解决方案1】:

要么:

Set<Foo> fooSet = new LinkedHashSet<>(one);
fooSet.addAll(two);
List<Foo> finalFoo = new ArrayList<>(fooSet);

或

List<Foo> twoCopy = new ArrayList<>(two);
twoCopy.removeAll(one);
one.addAll(twoCopy);

【讨论】:

  • 但是,OP 使用的是 Java 1.2,因此重写以删除泛型可能会更好。
  • 对于第二种解决方案,我们为什么要创建一个twoCopy?我们可以只使用 one.removeAll(two); one.addAll(two): ?
  • 只有不想修改原来的两个列表时才需要副本。关于第二个问题:元素的顺序不一样。
  • @CongWang 如果您不需要原始的two 列表。你可以two.removeAll(one); one.addAll(two)
【解决方案2】:
for (Object x : two){
   if (!one.contains(x))
      one.add(x);
}

假设您不想使用评论中建议的集合。如果您正在寻找比这更高级的东西,请澄清您的问题。

【讨论】:

  • 对于 Java 1.2 或 1.4 版中不支持的每个。我的设备正在运行 java 1.2。
  • 所以不要使用 for each 而是使用 for
  • 是的..这就是我试过的。但我只是想知道是否有更好的方法或者这是最好的方法..
  • 如果您想坚持使用List,这是一种完全可以接受的方式。根据数据集的大小,Set 或 SortedList 可能会为您提供更好的性能,即使您必须随后复制回 List
  • @JohnB 你的解决方案是 O(n^2) 对吗?
【解决方案3】:

试试这种东西。由于Set 不允许重复,您只能添加更改

ArrayList<String> a=new ArrayList<>();
a.add("a");
a.add("b");
ArrayList<String> b=new ArrayList<>();
a.add("a");
a.add("c");
Set<String> s=new HashSet<String>();
s.addAll(a);
s.addAll(b);
a=new ArrayList<>(s);
for(String r:a){
    System.out.println(r);
}

【讨论】:

  • 您的代码 sn-p 过大。假设我们知道如何将它打包成 main 以及在哪里可以找到正常的导入。只需包含代码。
【解决方案4】:

你可以这样做:

ArrayList<Object> result = new ArrayList<>();
result.addAll(one);

for(Object e: two){
    if(!result.contains(e))
        result.add(e);
}

【讨论】:

  • 你需要初始化result。你可以只做ArrayList result = new ArrayList(one); 而不是第一个循环。
  • @Keppil 好吧,它不是确切的代码,arraylist 应该是通用的,我只是给出一个想法
  • @ay89 OP 使用的是 Java 1.2,所以没有泛型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-05
  • 2011-03-19
  • 1970-01-01
  • 2014-01-15
  • 2013-09-08
  • 2021-07-28
相关资源
最近更新 更多