对于List你知道哪些操作?
在项目的开发过程中经常要用到list的结构,如何快速的提取出list<实体>中属性的值相同的实体和不同的实体呢?
1、简单的List做交集和差集和并集
先定义两个list:
(1)交集
List1.retainAll(List2)
(2)差集
List1.removeAll(list2);
(3) 并集
List1.removeAll(list2);
List1.addAll(list2);
2、比较 list<实体>中实体中的属性相同和不同的情况
实体类如下:
package com.bug.demo.domain;
import lombok.Data;
/**
* @author: create by bughuang
* @version: v1.0
* @description:
* @date:2020/3/11
*/
@Data
public class PeopleInfo {
private int id;
/**
* 姓名
*/
private String userName;
/**
* 性别
*/
private String sex;
/**
* 年龄
*/
private String age;
/**
* 电话
*/
private String phone;
}
现在想取出年龄相同的实体组成一个新的实体,年龄不同的组成另外一个实体。
定义两个list<PeopleInfo>并赋值
List<PeopleInfo> peopleInfoList = new ArrayList<>();
List<PeopleInfo> peopleInfoList1 = new ArrayList<>();
for (int i = 1; i < 5000; i++) {
PeopleInfo peopleInfo = new PeopleInfo();
peopleInfo.setId(i);
peopleInfo.setUserName("123456");
if (i % 2 == 0) {
peopleInfo.setAge("1");
} else {
peopleInfo.setAge("2");
}
peopleInfoList.add(peopleInfo);
}
int c = 3;
for (int j = 6000; j < 10000; j++) {
PeopleInfo peopleInfo = new PeopleInfo();
peopleInfo.setId(j);
peopleInfo.setUserName("78910");
if (j % 2 == 0) {
peopleInfo.setAge("2");
} else {
c= c+1;
peopleInfo.setAge(String.valueOf(c));
}
peopleInfoList1.add(peopleInfo);
}
这里故意设置数据量偏大一点,看看运行效率。
(1)先做并集
定义一个peopleInfoList2:
List<PeopleInfo> peopleInfoList2 = new ArrayList<>();
peopleInfoList2.addAll(peopleInfoList);
peopleInfoList2.addAll(peopleInfoList1);
(2)定义一个hashmap
利用其中的key 不能重复作为判断条件。
HashMap<String, PeopleInfo> StudentMap = new HashMap<String, PeopleInfo>();
(3)循环判断
循环peopleInfoList2,取出peopleInfoList2中PeopleInfo 的属性的age作为StudentMap 的key,实体作为value。判断map 中的key 是否已经存在,如果key 不存在:
StudentMap.put(key, key的value);
并定义一个peopleInfoList3 添加这个实体到其中:
peopleInfoList3.add(person);
如存在定义一个peopleInfoList4添加这个实体到其中:
peopleInfoList4.add(person);
3、整体代码如下2
public List<PeopleInfo> Test() {
List<PeopleInfo> peopleInfoList = new ArrayList<>();
List<PeopleInfo> peopleInfoList1 = new ArrayList<>();
List<PeopleInfo> peopleInfoList2 = new ArrayList<>();
for (int i = 1; i < 5000; i++) {
PeopleInfo peopleInfo = new PeopleInfo();
peopleInfo.setId(i);
peopleInfo.setUserName("123456");
if (i % 2 == 0) {
peopleInfo.setAge("1");
} else {
peopleInfo.setAge("2");
}
peopleInfoList.add(peopleInfo);
}
int c = 3;
for (int j = 6000; j < 10000; j++) {
PeopleInfo peopleInfo = new PeopleInfo();
peopleInfo.setId(j);
peopleInfo.setUserName("78910");
if (j % 2 == 0) {
peopleInfo.setAge("2");
} else {
c= c+1;
peopleInfo.setAge(String.valueOf(c));
}
peopleInfoList1.add(peopleInfo);
}
System.out.println("b" + peopleInfoList1);
//以上是定义List下面才是找出相同和不同属性的实体
peopleInfoList2.addAll(peopleInfoList);
peopleInfoList2.addAll(peopleInfoList1);
List<PeopleInfo> peopleInfoList3 = new ArrayList<>();
List<PeopleInfo> peopleInfoList4 = new ArrayList<>();
HashMap<String, PeopleInfo> StudentMap = new HashMap<String, PeopleInfo>();
for (PeopleInfo person : peopleInfoList2) {
if (StudentMap.get(person.getAge()) == null) {
StudentMap.put(person.getAge(), person);
peopleInfoList3.add(person);
} else {
peopleInfoList4.add(person);
}
}
return peopleInfoList3;
}
核心就是用hashmap的key 不能重复作为判断条件。
你们有什么更好的办法吗?可以在下面评论哦,互相进步啊。