假设我有一个点的arrayList1。数据结构是这样的:
(1,2)->(2,2)->(3,2)->(4,2)->(5,2)
我有另一个要点的arrayList2:
(2,2)->(1,2)->(8,5)->(9,3)
如何比较两个列表并将不存在的值从arrayList2添加到arrayList1?

当前解决方案

我现在能想到的唯一方法是使用for循环比较arrayList1中的每个点,例如if(!arrayList1.contains(arrayList2.get(i))){ arrayList1.add(arrayList2.get(i)); } i++;

是否有更有效的方法或已经从类准备好的方法?因为我有arrayList1直到arrayList6进行比较和替换...。

最佳答案

  • 对于单线恋人(running demo):

    List<Point> list3 = new ArrayList<Point>(new HashSet<Point>(list1){{ addAll(list2); }});
    
  • 安全版本* (running demo):

    Set<String> tmpSet = new HashSet<String>(arrayList1);
    tmpSet.addAll(arrayList2);
    List<String> mergedList = new ArrayList<String>(tmpSet);
    

    *正如布鲁斯·韦恩(Bruce Wayne)正确指出的那样,由于下面的文章中描述了潜在的缺点,因此应谨慎使用Double Brace initialization(单行示例,在两个示例中也用于填充前两个列表):

    Don’t be “Clever”: The Double Curly Braces Anti Pattern

  • 说明:Set不能包含重复项,因此请使用一个作为过渡向量。

    示例1的代码:

    List<String> arrayList1 = new ArrayList<String>(){{ add("One"); add("Two");   }};
    List<String> arrayList2 = new ArrayList<String>(){{ add("Two"); add("Three"); }};
    List<String> mergedList = new ArrayList<String>(new HashSet<String>(arrayList1){{ addAll(arrayList2); }});
    System.out.println(mergedList);
    

    输出:[1、2、3]

    示例2的代码:

    List<String> arrayList1 = new ArrayList<String>(){{ add("One"); add("Two");   }};
    List<String> arrayList2 = new ArrayList<String>(){{ add("Two"); add("Three"); }};
    Set<String> tmpSet = new HashSet<String>(arrayList1);
    tmpSet.addAll(arrayList2);
    List<String> mergedList = new ArrayList<String>(tmpSet);
    System.out.println(mergedList);
    

    输出:[1、2、3]

    10-04 14:56