群里一个老哥的问题:
请教一个问题,两个List,一个是服务端数据,一个是本地数据,如何判断本地数据中没有包含服务端的数据,因为每次请求服务器,服务端返回的List是一个新的内存地址,所以本地List.contains() 方法无效,我应该怎么比对----这是很常见的问题
有人回答重写实体类,equals方法,有人回答挨个取出来对比。
有人提到 Collections.disjoint方法,没错。这个确实是最简单的办法
private void initData() {
for (int i = 0; i < 5; i++) {
Student student = new Student();
student.setAge(i + 50);
student.setName("小明" + i);
student.setSex("男");
list1.add(student);
}
list1.add(new Student("小鸡鸡" , 18 , "男"));
for (int i = 0; i < 15; i++) {
Student student = new Student();
student.setAge(i);
student.setName("小菇凉");
student.setSex("女");
list2.add(student);
}
list2.add(new Student("小鸡鸡" , 18 , "男"));
if(!Collections.disjoint(list1 , list2)){
Toast.makeText(this,"有相交数据", Toast.LENGTH_SHORT).show();
tv1.setText("list1:\n" + list1.toString() + "\n" + "list2:\n" + list2.toString() + "\n" + "有相交数据");
}else {
Toast.makeText(this,"没有没有没有没有相交数据", Toast.LENGTH_SHORT).show();
tv1.setText("list1:\n" + list1.toString() + "\n" + "list2:\n" + list2.toString() + "\n" + "无相交数据");
}
}
输出结果:
下面看一下源码:
可以看到,他的核心就是5406行。遍历小的list,取出每一个bean。然后循环判断该bean是否在大的list里面。
最终的道理还是挨个取出来遍历,只是做了很多的兼容处理和优化。
非常棒的Api