java - java中查找两个List之间的共同和不同元素

标签 java

我想要得到以下内容
1. 两个列表之间的共同元素。
2. ListB中ListA中没有的元素
3. ListA中ListB中没有的元素

List<String> fruitsListA = new ArrayList<String>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Grapes");
List<String> fruitsListACopy = fruitsListA;

List<String> fruitsListB = new ArrayList<String>();
fruits.add("Strawberry");
fruits.add("Cranberry");
fruits.add("Orange");
fruits.add("Apple");
List<String> fruitsListBCopy = fruitsListB;

1. common elements between two list

    fruitsListACopy.retainAll(fruitsListB);

2. Elements in ListB which is not available in ListA

    fruitsListB.removeAll(fruitsListA);

3. Elements in ListA which is not available in ListB

    fruitsListA.removeAll(fruitsListBCopy);

情况 1:我能够获取两个列表中的共同项目。所以如果我打印fruitsListACopy它会给出['Apple']

情况2:我可以看到fruitsListA被自动修改,我的意思是它没有所有项目['Apple','Banana','Grapes'],它只有通用项目 ['苹果'] 。

情况 3:我可以看到fruitsListB 被自动修改,我的意思是,它没有包含所有项目 ['Strawberry','Cranberry','Orange','Apple'] ['草莓'、'蔓越莓'、'橙子'] 删除了苹果的 coomon 项目。
我什至可以看到fruitsListA被自动修改,我的意思是它没有所有项目['Apple','Banana','Grapes'],它只有通用项目 ['苹果'] 。

当我使用removeAll和retainAll方法时,复制列表中所做的更改会反射(reflect)在原始列表中。

还有其他最好的方法来满足这个需求吗?

最佳答案

创建一个新实例,而不是将同一对象分配给另一个引用。

例如,您可以替换:

    List<String> fruitsListACopy = fruitsListA;

    List<String> fruitsListACopy = new ArrayList<>(fruitsListA);

如果您不希望在复制列表上的操作之间产生副作用,则必须在对原始列表执行每个操作之前创建原始列表的新副本。

然后,您必须在复制的列表上调用 retainAll()removeAll() 并将原始列表作为参数提供给方法。

这是一个示例代码来说明:

public static void main(String[] args) {
    List<String> fruitsListA = new ArrayList<String>();
    fruitsListA.add("Apple");
    fruitsListA.add("Banana");
    fruitsListA.add("Grapes");

    List<String> fruitsListB = new ArrayList<String>();
    fruitsListB.add("Strawberry");
    fruitsListB.add("Cranberry");
    fruitsListB.add("Orange");
    fruitsListB.add("Apple");

    // copy for A
    List<String> fruitsListACopy = new ArrayList<>(fruitsListA);
    fruitsListACopy.retainAll(fruitsListB);
    // handle the result of fruitsListACopy
    System.out.println("fruitsListACopy="+fruitsListACopy);

    // copy for B
    List<String> fruitsListBCopy = new ArrayList<>(fruitsListB);
    fruitsListBCopy.removeAll(fruitsListA);
    // handle the result of fruitsListBCopy
    System.out.println("fruitsListBCopy="+fruitsListBCopy);

    // copy for A
    fruitsListACopy = new ArrayList<>(fruitsListA);
    fruitsListACopy.removeAll(fruitsListB);
    // handle the result of fruitsListACopy
    System.out.println("fruitsListACopy="+fruitsListACopy);
}

输出:

fruitsListACopy=[Apple]

fruitsListBCopy=[Strawberry, Cranberry, Orange]

fruitsListACopy=[Banana, Grapes]

关于java - java中查找两个List之间的共同和不同元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43181154/

相关文章:

java - 通过 Eclipse maven2 的 Pom/项目属性

java - 为什么要在 App Engine 上设置系统属性(例如 java.vm.specation.version)?

java - 如何杀死等待中的线程?

Java:初始化一个新的 LinkedList 集合

java - 如何用双引号 (","之间的逗号替换字符串中的所有逗号 (,)?

java - Liferay 工作流程与 Kaleo : use custom class on task

java - 无法在我的 mac Os X 上运行 Ant?

java - 为什么这段代码不起作用? HTTP 状态 404 – 在 jsp 和 servlet 上未找到

java - 使用 Google Maps Api V2 时,Android 2.2 或 4.1.2 模拟器上缺少 Google Play 服务

java - 在android中向HTTPservlet发送数据