两个List中的对象类型相同,通过id字段判断是否相同
多的少的分开存,还有我找的是时间复杂度比我方法低的,不是纯粹代码量少的,代码少对于性能上没任何意义
我现在的做法是,把list2转成Map,然后循环list1,可以得到list1存在但list2不存在的元素
然后再两个list反过来再执行一次,这样就能得到list2中存在,但list1不存在的元素
有没有更方便的方法可以实现这个功能,一样的方法就不用发了
目前没想到时间复杂度更好的算法。在你的基础上,说下自己的拙见
构建一个类
A
{
你的对象;
int value;
}
创建一个map<id, A>,之后分别遍历list1和list2,按下面规则存入map
存在于list1, value=1
存在于list2, value=2
同时存在于list1和list2,value=3
之后遍历map,取对象
value=1的对象就是list1存在而list2不存在的,
value=2的对象就是list2存在而list1不存在的,
value=3的对象就是list1和list2都存在。
听明白了 你是要的list1和list2的并集减去他们的交集 所得到的结果 下面这个图红色部分是你要的?
list1∪ list2 - list1 ∩ list2
结果:
代码:
class Student {
private int age;
private String name;
private String sex;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Student [age=" + age + ", name=" + name + ", sex=" + sex + "]";
}
public Student(int age, String name, String sex) {
super();
this.age = age;
this.name = name;
this.sex = sex;
}
public Student() {
super();
// TODO Auto-generated constructor stub
}
}
class Test {
public static void main(String[] args) {
List<Student> list1 = new ArrayList<Student>();
for (int i = 0; i < 1; i++) {
Student student = new Student();
student.setAge(i + 50);
student.setName("小红");
student.setSex("男");
list1.add(student);
}
Student student1 = new Student(1, "小白", "男");
list1.add(student1);
List<Student> list2 = new ArrayList<Student>();
for (int i = 0; i < 1; i++) {
Student student = new Student();
student.setAge(i);
student.setName("小绿");
student.setSex("女");
list2.add(student);
}
list2.add(student1);
// 交集
List<Object> list = new ArrayList<Object>(Arrays.asList(new Object[list1.size()]));
Collections.copy(list, list1);
list.retainAll(list2);
System.out.println("交集 ->"+list);
System.out.println("-----------------------------------------");
// 并集
List<Object> ulist = new ArrayList<Object>(Arrays.asList(new Object[list1.size()]));
Collections.copy(ulist, list1);
ulist.addAll(list2);
ulist = (List<Object>) ulist.stream().distinct().collect(Collectors.toList());
System.out.println("并集 ->"+ulist);
System.out.println("-----------------------------------------");
// 去交集 得到两个list都没有的数据
List<Object> slist = new ArrayList<Object>(Arrays.asList(new Object[ulist.size()]));
Collections.copy(slist, ulist);
slist.removeAll(list);
System.out.println("你要的结果 ->"+slist);
}
}
核心代码其实就下面这几行
//求并集
List<Student> result = new ArrayList<Student>(Arrays.asList(new Student[list1.size()]));
Collections.copy(result, list1);
result.addAll(list2);
result = ((List<Student>) result.stream().distinct().collect(Collectors.toList()));
//求交集
list1.retainAll(list2);
//求补集
result.removeAll(list1);
System.out.println(result);
package com.jerex.redis;
import java.util.Objects;
public class Obj {
private Integer id;
private String name;
public Obj() {
}
public Obj(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//这里修改了
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Obj obj = (Obj) o;
return Objects.equals(id, obj.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
@Override
public String toString() {
return "Obj{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
package com.jerex.redis;
import org.apache.commons.collections4.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
/**
* Hello world!
*
*/
public class App
{
public static void main(String[] args) {
List<Obj> list1 = new ArrayList<>();
List<Obj> list2 = new ArrayList<>();
list1.add(new Obj(123456,"aaa"));
list1.add(new Obj(1234567,"bbb"));
list2.add(new Obj(1234567,"bbb"));
list2.add(new Obj(12345678,"ccc"));
//并集
List<Obj> union = new ArrayList<>(CollectionUtils.union(list1, list2));
System.out.println(union);
//交集
List<Obj> objs = new ArrayList<>(CollectionUtils.intersection(list1, list2));
System.out.println(objs);
//差集的补集
List<Obj> disjunction = new ArrayList<>(CollectionUtils.disjunction(list1, list2));
System.out.println(disjunction);
}
}
[Obj{id=12345678, name='ccc'}, Obj{id=1234567, name='bbb'}, Obj{id=123456, name='aaa'}]
[Obj{id=1234567, name='bbb'}]
[Obj{id=12345678, name='ccc'}, Obj{id=123456, name='aaa'}]
这不是实现了吗