java集合差集_Java集合的交集,并集和差集

0x01 概要

项目中有时会遇到计算集合的交集, 差集和并集的操作.现写个Demo作为笔记.

Demo前提条件

Person 为集合中的对象,且有唯一id

listA包含1,2,3,6四个对象

listB包含1,2,4,7四个对象

listC包含1,3,4,5四个对象

1460000010213244

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 项目代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值