取出两个List<user>集合相同的数据和不同的数据

取出两个List(user 对象里面有 id,name)集合相同的数据和不同的数据,相同和不同用id来判断,最优的方法,本人小白一枚,虽然能写出来,但是感觉麻烦,求大神指点!

5个回答

public class User {

    private Integer id;
    private String name;

    @Override
    public int hashCode() {
        return id.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        boolean isSame = false;
        User user;
        if (obj instanceof User &&  (user = ((User) obj)).getId() != null) {
            isSame = user.getId().equals(id);
        }
        return isSame;
    }

    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 String toString() {
        return "id="+id;
    }

    public static void main(String[] args) {
        List<User> userList1 = new ArrayList<>(10);
        List<User> userList2 = new ArrayList<>(10);
        for (int i=0; i<10; i++) {
            User user = new User();
            double d = Math.random();
            user.setId((int)(d*10));
            userList1.add(user);
            user = new User();
            d = Math.random();
            user.setId((int)(d*5));
            userList2.add(user);
        }
        Set<User> result = new HashSet<>(userList1);
        result.removeAll(userList2);
        System.out.println(userList1+","+userList2+",result="+result);
        result = new HashSet<>(userList1);
        result.retainAll(userList2);
        System.out.println(userList1+","+userList2+",result="+result);
    }
}
    public static void main(String[] args) {
        List<Integer> list1 = new ArrayList<Integer>();
        for (int i = 0; i < 5; i++) {
            list1.add(i);
        }
        List<Integer> list2 = new ArrayList<Integer>();
        for (int i = 2; i < 8; i++) {
            list2.add(i);
        }
        System.out.println("List1的数据:" + list1);
        System.out.println("List2的数据:" + list2);
        List<Integer> repetition = getRepetition(list1, list2);
        System.out.println("交集为" + repetition);
        list1.removeAll(repetition);
        list2.removeAll(repetition);
        System.out.println("List1的不同数据:" + list1);
        System.out.println("List2的不同数据:" + list2);

    }
    /**
     * 两个list取重复
     * @param list1
     * @param list2
     * @return
     */
    public static List<Integer> getRepetition(List<Integer> list1,
                                              List<Integer> list2) {
        List<Integer> result = new ArrayList<Integer>();
        for (Integer integer : list2) {//遍历list1
            if (list1.contains(integer)) {//如果存在这个数
                result.add(integer);//放进一个list里面,这个list就是交集
            }
        }
        return result;
    }

ArrayList中提供了一个retainAll方法就是求两个集合的交集。首先要把list1 clone一份,因为retainAll之后会改变它的值。clone两种方式,一种list1.clone这是浅克隆,
或者new ArrayList<>(list1);用这个clone出来的在removeAll原来的list1就ok了。

public static void testList(){
List list1=new ArrayList<>();
List list2=new ArrayList<>();

    User user1=new User(1,"Messi");
    User user2=new User(2,"kaka");
    User user3=new User(3,"Ronaldo");
    list1.add(user1);
    list1.add(user2);
    list1.add(user3);

    User user4=new User(4,"Zidane");
    list2.add(user2);
    list2.add(user4);

    List<User> list=new ArrayList<>();
    list.addAll(list1);
    list.addAll(list2);
     //list是两者的集合
    LogUtils.e(new Gson().toJson(list));
            输出:[{"id":1,"name":"Messi"},{"id":2,"name":"kaka"},{"id":3,"name":"Ronaldo"},{"id":2,"name":"kaka"},{"id":4,"name":"Zidane"}]

    //retainAll方法 取得两个List的交集
    list1.retainAll(list2);
    //list1变成2者的交集
    LogUtils.e(new Gson().toJson(list1));
            输出:[{"id":2,"name":"kaka"}]

    //2者的集合去掉交集
    list.removeAll(list1);
    LogUtils.e(new Gson().toJson(list));
            输出:[{"id":1,"name":"Messi"},{"id":3,"name":"Ronaldo"},{"id":4,"name":"Zidane"}]

重写实体类的equals和hashcode 方法 ;只勾选id字段 ;然后两个listA,B取交集(list.retainAll)C就是相同数据;再用A ,B 分别去除C(list.removeAll)就是不同数据;

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问