我有两套相同的结构。我想通过id字段将它们组合起来。 组合应在特定字段上进行(对于l1 Num2和对于l2 Num1),不应更改所有其他字段。
List<MyClass> l1=[{id = 1 , num1 = 3 , num2 = 0 , name = "yoyo"},
{id = 2 , num1 = 9 , num2 = 0 , name = "lolo"},
{id = 3 , num1 = 4 , num2 = 0 , name = "bobo"},
{id = 8 , num1 = 2 , num2 = 0 , name = "toto"}];
List<MyClass> l2=[{id = 1 , num1 = 0 , num2 = 3 , name = "yoyo"},
{id = 2 , num1 = 0 , num2 = 7 , name = "lolo"},
{id = 3 , num1 = 0 , num2 = 8 , name = "bobo"},
{id = 6 , num1 = 0 , num2 = 7 , name = "zozo"}];
// i want to combine the lists to get l3 like this one
list<MyClass> l3=[{id = 1 , num1 = 3 , num2 = 3 , name = "yoyo"},
{id = 2 , num1 = 9 , num2 = 7 , name = "lolo"},
{id = 3 , num1 = 4 , num2 = 8 , name = "bobo"},
{id = 8 , num1 = 2 , num2 = 0 , name = "toto"},
{id = 6 , num1 = 0 , num2 = 7 , name = "zozo"}];
答案 0 :(得分:3)
l3.addall(l1);
for(int i=0;i<l2.size();i++){
for(int j=0;j<l3.size();j++){
if(l2.get(i).id!=l3.get(j).id)
l3.add(l2.get(i);
else{
l3.get(j).num2=l2.get(i).num2;
}
}
}
答案 1 :(得分:1)
我建议您使用java 8流API,例如:
l1.addAll(l2.stream().filter(
mc -> !l1.stream().anyMatch(
mcl1 -> mcl1.id==mc.id))
.collect(Collectors.toList()));
在这里,你可以尝试一下,它会改变我:
List<MyClass> l1 = new ArrayList<>(Arrays.asList(new MyClass[]{new MyClass(1,1),new MyClass(2,2)}));
List<MyClass> l2 = new ArrayList<>(Arrays.asList(new MyClass[]{new MyClass(1,1),new MyClass(3,3)}));
l1.addAll(l2.stream().filter(
mc -> !l1.stream().anyMatch(
mcl1 -> mcl1.id==mc.id))
.collect(Collectors.toList()));
l1.forEach(b -> System.out.println("id: " + b.getId() + " num1: " + b.getNum1()));
为了解释我使用l2.stream.filter
过滤第二个列表而不等于id元素,collect(Collectors.toList())
将过滤器的结果作为列表返回,l1.addAll
将返回的元素添加到列表中。对于这个解决方案,它为我打印:
id: 1 num1: 1
id: 2 num1: 2
id: 3 num1: 3