qq_36911145
封印di恶魔
采纳率9.1%
2021-02-25 11:58

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

已结题

两个List中的对象类型相同,通过id字段判断是否相同

多的少的分开存,还有我找的是时间复杂度比我方法低的,不是纯粹代码量少的,代码少对于性能上没任何意义

我现在的做法是,把list2转成Map,然后循环list1,可以得到list1存在但list2不存在的元素

然后再两个list反过来再执行一次,这样就能得到list2中存在,但list1不存在的元素

有没有更方便的方法可以实现这个功能,一样的方法就不用发了

  • 点赞
  • 收藏
  • 复制链接分享

4条回答

  • weixin_42534024 何必要如此 2月前
    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'}]

    这不是实现了吗

    点赞 评论 复制链接分享
  • weixin_37519752 键盘行者 2月前

    结果:

     代码:

    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);
    点赞 评论 复制链接分享
  • weixin_42534024 何必要如此 2月前

    听明白了  你是要的list1和list2的并集减去他们的交集 所得到的结果 下面这个图红色部分是你要的?

    list1∪ list2  - list1 ∩ list2 

    点赞 评论 复制链接分享
  • hunger_wang hunger_wang 2月前

    目前没想到时间复杂度更好的算法。在你的基础上,说下自己的拙见

    构建一个类
    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都存在。

    点赞 评论 复制链接分享

为你推荐