需求:求两个List的并集,并将交集部分的对象按照一定的规则进行保留。
前提条件:假设存在一个对象DemoBean ,DemoBean 的结构如下:
public class DemoBean {
private int id;
private long lastTime;
public DemoBean(int id, long lastTime) {
this.id = id;
this.lastTime = lastTime;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public long getLastTime() {
return lastTime;
}
public void setLastTime(long lastTime) {
this.lastTime = lastTime;
}
@Override
public String toString() {
return "DemoBean{" +
"id=" + id +
", lastTime=" + lastTime +
'}';
}
}
解释:用ID来判断DemoBean 是否重复, 同一ID的lastTime可能不同,需要保留ID相同的Bean的lastTime比较大(时间比较近)的Bean对象。
假设有两个List list1 和 list2,定义如下:
List<DemoBean > list1 = new ArrayList<>();
List<DemoBean > list2 = new ArrayList<>();
现在我们需要获取的是list1和list2的并集,并且交集部分的保留方式是lastTime比较新的对象,代码如下:
public class Utils {
public static List<DemoBean> getList(List<DemoBean> list1, List<DemoBean> list2) {
List<DemoBean> result = new ArrayList<>();
Map<Integer, DemoBean > beanMap = new HashMap<>(list1.size() + list2.size());
List<DemoBean> max = list1;
List<DemoBean> min = list2;
if (list1.size() > list2.size()) {
max = list1;
min = list2;
}
for (DemoBean bean : max) {
beanMap.put(bean.getId(), bean);
}
for (DemoBean miniBean : min) {
DemoBean bean = beanMap.get(miniBean.getId());
// 重复元素 判断time 并保留时间比较新的
if (bean != null) {
// 比较time
if (miniBean.getLastTime() > bean.getLastTime()) {
// 原数据替换为miniBean
beanMap.put(bean.getId(), miniBean);
}
continue;
}
// 未出现过
beanMap.put(bean.getId(), miniBean);
}
for (Map.Entry<Integer,DemoBean > entry :beanMap.entrySet()){
result.add(entry.getValue());
}
return result;
}
}
main方法如下
public class test {
public static void main(String[] args) {
List<DemoBean> list1 = new ArrayList<>();
List<DemoBean> list2 = new ArrayList<>();
for (int i = 0 ; i < 100000; i ++) {
list1.add(new DemoBean(i, i + 30));
}
for (int i = 1000000 ; i < 200000; i ++) {
list1.add(new DemoBean(i, i));
}
for (int i = 0; i< 100000; i ++) {
list2.add(new DemoBean(i, i + 50));
}
long startTime = System.currentTimeMillis();
List<DemoBean> list = Utils.getList(list1, list2);
System.out.println("getList time: " + (System.currentTimeMillis() - startTime) + "ms");
for (int i = 0; i< 30; i ++) {
System.out.println(list.get(i).toString());
}
}
}
执行结果如下,性能非常OK。
如有雷同,纯属巧合~