想要两个list合并成同一个list,然后再当前list中相同id属性的对象进行合并,不同的也要保留
List<Info> list1 = new ArrayList<>();
Info info1 = new Info();
info1.setId(1);
info1.setCount1(100);
Info info2 = new Info();
info2.setId(2);
info2.setCount1(200);
Info info3 = new Info();
info3.setId(3);
info3.setCount1(300);
list1.add(info1);
list1.add(info2);
list1.add(info3);
List<Info> list2 = new ArrayList<>();
Info info4 = new Info();
info4.setId(1);
info4.setCount2(100);
Info info5 = new Info();
info5.setId(2);
info5.setCount2(200);
Info info6 = new Info();
info6.setId(4);
info6.setCount2(400);
list2.add(info4);
list2.add(info5);
list2.add(info6);
@Data
public class Info{
private Integer id;
private BigDecimal count1;
private BigDecimal count2;
}
我尝试根据id合并为同一个list,但是不同id的无法保留下来
例 处理完的list:[Info(id=1, count1=100, count2=100), Info(id=2, count1=200, count2=200)]
之后在根据处理完的list跟原list1,list2取差集
最好合并后都进行保留
[Info(id=1, count1=100, count2=100), Info(id=2, count1=200, count2=200), Info(id=3, count1=300, count2=null), Info(id=4, count1=null, count2=400)]
import lombok.Data;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@Data
public class Info {
private Integer id;
private Integer count1;
private Integer count2;
public static void main(String[] args) {
List<Info> list1 = new ArrayList<>();
Info info1 = new Info();
info1.setId(1);
info1.setCount1(100);
Info info2 = new Info();
info2.setId(2);
info2.setCount1(200);
Info info3 = new Info();
info3.setId(3);
info3.setCount1(300);
list1.add(info1);
list1.add(info2);
list1.add(info3);
List<Info> list2 = new ArrayList<>();
Info info4 = new Info();
info4.setId(1);
info4.setCount2(100);
Info info5 = new Info();
info5.setId(2);
info5.setCount2(200);
Info info6 = new Info();
info6.setId(4);
info6.setCount2(400);
list2.add(info4);
list2.add(info5);
list2.add(info6);
labe1:
for (int i = 0; i < list2.size(); i++) {
Info info_2 = list2.get(i);
for (int j = 0; j < list1.size(); j++) {
Info info_1 = list1.get(j);
if (info_2.getId().equals(info_1.getId())) {
if (info_2.getCount1() != null) {
info_1.setCount1(info_2.getCount1());
}
if (info_2.getCount2() != null) {
info_1.setCount2(info_2.getCount2());
}
continue labe1;
}
}
list1.add(info_2);
}
System.out.println(list1);
}
}
public void concat() throws IllegalAccessException {
List<Info> list1 = new ArrayList<>();
Info infoItem1 = new VisitRecordController.Info();
infoItem1.setId("1");
infoItem1.setCount1(100);
Info infoItem2 = new Info();
infoItem2.setId("2");
infoItem2.setCount1(200);
Info info3 = new Info();
info3.setId("3");
info3.setCount1(300);
list1.add(infoItem1);
list1.add(infoItem2);
list1.add(info3);
List<Info> list2 = new ArrayList<>();
Info info4 = new Info();
info4.setId("1");
info4.setCount2(100);
Info info5 = new Info();
info5.setId("2");
info5.setCount2(200);
Info info6 = new Info();
info6.setId("4");
info6.setCount2(400);
list2.add(info4);
list2.add(info5);
list2.add(info6);
Map<String, Info> infoMap = new HashMap();
for (Info info1 : list1) {
infoMap.put(info1.getId(), info1);
}
Info info1;
List<Info> newInfo2List = new ArrayList<>();
for (Info info2 : list2) {
// 遍历第二集合,如果与第一集合某项id相同
if (infoMap.containsKey(info2.getId())) {
info1 = infoMap.get(info2.getId());
// 反射遍历第二集合项的属性值
for (Field field : info2.getClass().getDeclaredFields()) {
field.setAccessible(true);
// 如果第一集合项某属性值为空,而第二集合项该属性值不为空,则填入
if (field.get(info2) != null && field.get(info1) == null) {
field.set(info1, field.get(info2));
}
}
} else {
// 将没有相同id的第二集合项放入新的集合
newInfo2List.add(info2);
}
}
list1.addAll(newInfo2List);
System.out.println(list1);
}
您的采纳就是对我最大的鼓励,谢谢!!!
不知道你解决了没?
如果没有解决,我们可以聊聊。
这个其实还好的,你直接遍历,然后根据条件判断即可。
如果有不明白的,我们可以交流交流。
如注释
package service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class MergeList {
public static void main(String[] args) {
List<Info> list1 = new ArrayList<>();
Info info1 = new Info();
info1.setId(1);
info1.setCount1(new BigDecimal(100));
Info info2 = new Info();
info2.setId(2);
info2.setCount1(new BigDecimal(200));
Info info3 = new Info();
info3.setId(3);
info3.setCount1(new BigDecimal(300));
list1.add(info1);
list1.add(info2);
list1.add(info3);
List<Info> list2 = new ArrayList<>();
Info info4 = new Info();
info4.setId(1);
info4.setCount2(new BigDecimal(100));
Info info5 = new Info();
info5.setId(2);
info5.setCount2(new BigDecimal(200));
Info info6 = new Info();
info6.setId(4);
info6.setCount2(new BigDecimal(400));
list2.add(info4);
list2.add(info5);
list2.add(info6);
//缓存不同部分
List<Info> dif=new ArrayList<>();
//是否存在的标志
boolean exist;
for (Info to : list1) {
exist=false;
//以list2为标准进行判重
for (Info from : list2) {
if (Objects.equals(to.getId(), from.getId())){
if (from.getCount1()==null){
from.setCount1(to.getCount1());
}
if (from.getCount2()==null){
from.setCount2(to.getCount2());
}
exist=true;
}
}
if (!exist){
dif.add(to);
}
}
//合并不同部分
list2.addAll(dif);
System.out.println(list2);
}
}
package service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class MergeList {
public static void main(String[] args) {
List<Info> list1 = new ArrayList<>();
Info info1 = new Info();
info1.setId(1);
info1.setCount1(new BigDecimal(100));
Info info2 = new Info();
info2.setId(2);
info2.setCount1(new BigDecimal(200));
Info info3 = new Info();
info3.setId(3);
info3.setCount1(new BigDecimal(300));
list1.add(info1);
list1.add(info2);
list1.add(info3);
List<Info> list2 = new ArrayList<>();
Info info4 = new Info();
info4.setId(1);
info4.setCount2(new BigDecimal(100));
Info info5 = new Info();
info5.setId(2);
info5.setCount2(new BigDecimal(200));
Info info6 = new Info();
info6.setId(4);
info6.setCount2(new BigDecimal(400));
list2.add(info4);
list2.add(info5);
list2.add(info6);
//缓存不同部分
List<Info> dif=new ArrayList<>();
//是否存在的标志
boolean exist;
for (Info to : list1) {
exist=false;
//以list2为标准进行判重
for (Info from : list2) {
if (Objects.equals(to.getId(), from.getId())){
if (from.getCount1()==null){
from.setCount1(to.getCount1());
}
if (from.getCount2()==null){
from.setCount2(to.getCount2());
}
exist=true;
}
}
if (!exist){
dif.add(to);
}
}
//合并不同部分
list2.addAll(dif);
System.out.println(list2);
}
}