在java

时间:2017-04-03 09:34:50

标签: 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自动修改我的意思是没有所有的项目['草莓','蔓越莓','橙','苹果']它只有 ['草莓','蔓越莓','橙''除去了苹果的coomon项目 我甚至可以看到fruitsListA自动修改我的意思是代替所有的项目['Apple','Banana','Grapes']它只有共同的项目 ['苹果'] 。

当我使用removeAll和retainAll方法时,复制列表中所做的更改将反映在原始列表中。

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

2 个答案:

答案 0 :(得分:1)

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

例如,您可以替换:

    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 = [草莓,蔓越莓,橙]

     

fruitsListACopy = [香蕉,葡萄]

答案 1 :(得分:0)

  

我甚至可以看到fruitsListA自动修改

制作像yhis这样的副本时

List<String> fruitsListACopy = fruitsListA;

您不复制列表。相反,您可以引用现有列表。因此,对“副本”的所有修改都反映在原文上。

要制作副本,请再次调用构造函数:

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