取出两个List(user 对象里面有 id,name)集合相同的数据和不同的数据,相同和不同用id来判断,最优的方法,本人小白一枚,虽然能写出来,但是感觉麻烦,求大神指点!
重写实体类的equals和hashcode 方法 ;只勾选id字段 ;然后两个listA,B取交集(list.retainAll)C就是相同数据;再用A ,B 分别去除C(list.removeAll)就是不同数据;
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"}]