比较一个列表相对于另一个列表多或少的元素

两个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'}]

这不是实现了吗