我想得到以下内容 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方法时,复制列表中所做的更改将反映在原始列表中。
还有其他最好的方式来满足这种需求吗?
答案 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);