如何在Java中组合两个列表

时间:2016-10-19 14:38:47

标签: java algorithm

我有两套相同的结构。我想通过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"}];

2 个答案:

答案 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