0x01 概要
项目中有时会遇到计算集合的交集, 差集和并集的操作.现写个Demo作为笔记.
Demo前提条件
Person 为集合中的对象,且有唯一id
listA包含1,2,3,6四个对象
listB包含1,2,4,7四个对象
listC包含1,3,4,5四个对象
Demo包含两个和三个集合的交集, 差集和并集:
listA与listB的交集
listA与listB, listC的交集
listA与listB的差集
listA与listB, listC的差集
listA与listB的并集
listA与listB, listC的并集
人工计算的结果应为:
listA与listB的交集为1,2
listA与listB, listC的交集为1
listA与listB的差集为3,6
listA与listB, listC的差集为6
listA与listB的并集为1,2,3,4,6,7
listA与listB, listC的并集1,2,3,4,5,6,7
0x02 准备代码
1. Person对象代码
对象Person的代码如下:
public class Person {
/**
* 性别:男
*/
public static final int SEX_MALE = 0;
/**
* 性别:女
*/
public static final int SEX_FEMALE = 1;
private String id; //身份id
private String name; //名字
private int age; //年龄
private int sex = SEX_MALE; //性别
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Person{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age=" + age +
", sex=" + sex +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
if (age != person.age) return false;
if (sex != person.sex) return false;
if (id != null ? !id.equals(person.id) : person.id != null) return false;
return name != null ? name.equals(person.name) : person.name == null;
}
@Override
public int hashCode() {
int result = id != null ? id.hashCode() : 0;
result = 31 * result + (name != null ? name.hashCode() : 0);
result = 31 * result + age;
result = 31 * result + sex;
return result;
}
}
2. 三个集合代码
三个集合代码分别如下:
private List getListC(BeanServer server) {
List listC = new ArrayList<>();
listC.add(server.getPerson1());
listC.add(server.getPerson3());
listC.add(server.getPerson4());
listC.add(server.getPerson5());
return listC;
}
private List getListB(BeanServer server) {
List listB = new ArrayList<>();
listB.add(server.getPerson1());
listB.add(server.getPerson2());
listB.add(server.getPerson4());
listB.add(server.getPerson7());
return listB;
}
private List getListA(BeanServer server) {
List listA = new ArrayList<>();
listA.add(server.getPerson1());
listA.add(server.getPerson2());
listA.add(server.getPerson3());
listA.add(server.getPerson6());
return listA;
}
3. 求交集的方法
计算交集的代码如下:
@SafeVarargs
private final void retain(List source, List... targets) {
List result = new ArrayList<>();
result.addAll(source);
if (targets != null && targets.length > 0) {
for (List target : targets) {
result.retainAll(target);
}
}
for (Person person : result) {
System.out.println(person);
}
}
4. 求差集的方法
计算差集的代码如下:
@SafeVarargs
private final void remove(List source, List... targets) {
List result = new ArrayList<>();
result.addAll(source);
if (targets != null && targets.length > 0) {
for (List target : targets) {
result.removeAll(target);
}
}
for (Person person : result) {
System.out.println(person);
}
}
5. 求并集的方法
计算交集的代码如下:
@SafeVarargs
private final void add(List source, List... targets) {
Set result = new HashSet<>();
result.addAll(source);
if (targets != null && targets.length > 0) {
for (List target : targets) {
result.addAll(target);
}
}
for (Person person : result) {
System.out.println(person);
}
}
0x03 开始计算
分别计算两个和三个集合的交集,差集和并集
/**
* 交集
*/
public void retain() {
System.out.println("===============listA retain listB===============");
retain(listA, listB);
System.out.println("===============listA retain listB, listC===============");
retain(listA, listB, listC);
}
/**
* 差集
*/
public void remove() {
System.out.println("===============listA remove listB===============");
remove(listA, listB);
System.out.println("===============listA remove listB, listC===============");
remove(listA, listB, listC);
}
/**
* 并集
*/
public void add() {
System.out.println("===============listA add listB===============");
add(listA, listB);
System.out.println("===============listA add listB, listC===============");
add(listA, listB, listC);
}
0x04 计算结果
计算结果如下:
===============listA===============
Person
Person
Person
Person
===============listB===============
Person
Person
Person
Person
===============listC===============
Person
Person
Person
Person
===============listA retain listB===============
Person
Person
===============listA retain listB, listC===============
Person
===============listA add listB===============
Person
Person
Person
Person
Person
Person
===============listA add listB, listC===============
Person
Person
Person
Person
Person
Person
Person
===============listA remove listB===============
Person
Person
===============listA remove listB, listC===============
Person
输出结果与人工计算结果一致.
0x05 项目代码