2016-10-19 8 views
1

У меня есть два набора одинаковых структур. Я хочу объединить их по полю id. Комбинация должна быть выполнена в определенном поле (для l1 Num2 и для l2 Num1) Все остальные поля не должны быть изменены.Как объединить два списка в Java

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"}]; 
+3

Это было бы проще, если бы вы использовали карту, где «поле id» было ключом. Таким образом, слияние будет просто «map1.putAll (map2)», вы также можете сделать «map1.get (id)» и «map1.remove (id)» –

+0

Что вы пробовали? – talex

+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; 
     } 
    } 
} 
+0

hehehee ... просто подходит для этого случая, но работает ':)' –

+0

код не работает. этот полученный результат - это размер списка l2 x l1, и мне нужно, чтобы l3 имел размер самого длинного списка как max {l1, l2}. , но это близко к правильному решению. Я пытаюсь отредактировать ответ, чтобы он работал нормально, но по какой-то причине он не обновлял –

+0

. Я принял ваш ответ, потому что он помог мне построить правильный ответ, спасибо. –

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()) return result from filter as list , и l1.addAll добавляет возвращенные элементы в список. Для этого решения он печатает для меня:

id: 1 num1: 1 
id: 2 num1: 2 
id: 3 num1: 3 
+0

код не работал. похоже, что l1 не изменился вообще. вы можете объяснить код, пожалуйста, –

+0

благодарим вас за обновление, но если я вас правильно понимаю. код просто добавил новую запись, если она не существовала по полю id. это не то, что я ищу. см. пример l3 –

Смежные вопросы