Поиск по сайту:

Как объединить два списка в Java?


Объединение двух списков в Java часто является полезной операцией. Эти списки могут быть ArrayLists или LinkedLists.

Как объединить два списка в Java

Есть несколько способов объединить два списка в Java. Давайте рассмотрим некоторые из простых, чтобы выполнить свою работу!

1. Метод addAll() для объединения двух списков

Метод addAll() является самым простым и наиболее распространенным способом объединения двух списков.

Для списка массивов:

import java.util.ArrayList;

public class Main {

    public static void main(String[] args)
    {
ArrayList<Integer> l1 = new ArrayList<Integer>();
        l1.add(1);
        l1.add(3);
        l1.add(5);
ArrayList<Integer> l2 = new ArrayList<Integer>();
        l2.add(2);
        l2.add(4);
        l2.add(6);
ArrayList<Integer> merge = new ArrayList<Integer>();
        merge.addAll(l1);
        merge.addAll(l2);
System.out.println("L1 : "+l1);
System.out.println("L2 : "+l2);
System.out.println("Merged : "+merge);
}
}

Обратите внимание, что порядок появления элементов соответствует порядку вызова addAll().

Для связанных списков:

import java.util.LinkedList;

public class Main {

    public static void main(String[] args)
    {
LinkedList<Integer> L1 = new LinkedList<>();
        L1.add(1);
        L1.add(3);
        L1.add(5);
LinkedList<Integer> L2 = new LinkedList<>();
        L2.add(2);
        L2.add(4);
        L2.add(6);
LinkedList<Integer> merged = new LinkedList<>();
        merged.addAll(L1);
        merged.addAll(L2);

System.out.println("L1 : "+L1);
System.out.println("L2 : "+L2);
System.out.println("Merged : "+merged);
}
}

2. Использование итераторов для объединения двух списков в Java

Мы можем использовать итератор для обхода списка и слияния.

Для списка массивов:

import java.util.ArrayList;

public class Main {

    public static void main(String[] args)
    {
ArrayList<Integer> l1 = new ArrayList<Integer>();
        l1.add(1);
        l1.add(3);
        l1.add(5);
ArrayList<Integer> l2 = new ArrayList<Integer>();
        l2.add(2);
        l2.add(4);
        l2.add(6);

ArrayList<Integer> Itmerge = new ArrayList<>();
        Iterator i = l1.iterator();
        while (i.hasNext()) {
           Itmerge.add((int)i.next());
        }
        i=l2.iterator();
        while (i.hasNext()) {
            Itmerge.add((int)i.next());
        }
System.out.println("L1 : "+l1);
System.out.println("L2 : "+l2);
System.out.println("Merged : "+Itmerge);
}
}

Итератор сначала проходит по ArrayList l1 и добавляет все элементы в Itmerge, затем он проходит по ArrayList l2 и добавляет все элементы в Itmerge.

Другой способ объединить два списка — просто добавить элементы из одного списка в другой. Нет необходимости создавать новый список, если только вам не нужно сохранить существующие данные нетронутыми.

Iterator i = l1.iterator();
while (i.hasNext())
{
  l2.add((int)i.next());
}

System.out.println("Merged : "+l2);

В этом случае все элементы добавляются в список l2. Это экономит память, потраченную на создание дополнительного списка. Добавление элементов одного списка в другой избавляет от дополнительного обхода.

Для LinkedList:

import java.util.LinkedList;

public class Main {

    public static void main(String[] args)
    {
LinkedList<Integer> L1 = new LinkedList<>();
        L1.add(1);
        L1.add(3);
        L1.add(5);
LinkedList<Integer> L2 = new LinkedList<>();
        L2.add(2);
        L2.add(4);
        L2.add(6);
LinkedList<Integer> merged = new LinkedList<>();
      
        Iterator i = L1.iterator();
        while (i.hasNext()) {
           L2.add((int)i.next());
        }
System.out.println(L2);
}
}

3. Объедините несколько списков, используя цикл for

Цикл for также полезен для объединения двух списков.

Для списка массивов:

import java.util.ArrayList;

public class Main {

    public static void main(String[] args)
    {
ArrayList<Integer> l1 = new ArrayList<Integer>();
        l1.add(1);
        l1.add(3);
        l1.add(5);
ArrayList<Integer> l2 = new ArrayList<Integer>();
        l2.add(2);
        l2.add(4);
        l2.add(6);
ArrayList<Integer> Itmerge = new ArrayList<>();
        for(int i=0;i<l1.size();i++){
            Itmerge.add(l1.get(i));
        }
        for(int i=0;i<l2.size();i++){
            Itmerge.add(l2.get(i));
        }
System.out.println(Itmerge);
}
}

Цикл проходит через оба ArrayLists и добавляет каждый элемент один за другим во вновь созданный список.

Добавление элементов одного списка в другой избавляет от дополнительного обхода.

 for(int i=0;i<l2.size();i++){
      l1.add(l2.get(i));
   }
System.out.println(l1);

Этот цикл for добавляет элементы l2 в l1 один за другим. В этом случае l1 будет содержать окончательный список объединенных элементов.

Для LinkedList:

Чтобы немного лучше понять обход связанных списков, давайте определим наш собственный связанный список.

Для этого потребуется класс для узлов. Узлу нужны две вещи: данные и адрес следующего узла.

Код для узла класса:

public class node {
    int data;
    node next;
    public node(int data){
        this.data=data;
        next=null;
    }
}

Обратите внимание, что следующий тип относится к узлу, поскольку он хранит адрес узла. Создание тех же двух списков, что и в предыдущих примерах:

public class Main {

    public static void main(String[] args)
    {        
        node head = new node(1);
        node temp = new node(3);
        head.next=temp;
        node temp1 = new node(5);
        temp.next=temp1;
        node head2 = new node(2);
        node temp2 = new node(4);
        head2.next=temp2;
        node temp3 = new node(6);
        temp2.next=temp3;
}
}

Это создаст списки, которые будут выглядеть так:

Каждая стрелка представляет следующую ссылку. Чтобы связать два списка вместе, нам нужно связать конец одного списка с заголовком второго.

Это можно сделать следующим образом:

node trav=head;
while(trav.next!=null){
    trav=trav.next;
}
trav.next=head2;

Узел «trav» инициируется и указывает на начало первого списка. Первый список просматривается до тех пор, пока trav не достигнет конца первого списка.

Когда конец достигнут, он изменяет следующую ссылку последнего узла на начало второго списка. Это формирует связь между двумя списками.

Печать всех списков:

public class Main {

    public static void main(String[] args)
    { 
        node head = new node(1);
        node temp = new node(3);
        head.next=temp;
        node temp1 = new node(5);
        temp.next=temp1;
        node head2 = new node(2);
        node temp2 = new node(4);
        head2.next=temp2;
        node temp3 = new node(6);
        temp2.next=temp3;

//printing list 1
        System.out.println("List 1 :");
        node trav = head;

        while(trav!=null){
            System.out.print(trav.data + " ");
            trav=trav.next;
        }

        System.out.println();
//prinitng list 2
        System.out.println("List 2 :");
        trav= head2;

        while(trav!=null){
            System.out.print(trav.data + " ");
            trav=trav.next;
        }
        System.out.println();

//merging the two list

         trav=head;
        while(trav.next!=null){
            trav=trav.next;
        }
        trav.next=head2;
// printing merged list
        System.out.println("merged list :");
        trav = head;
        while(trav!=null){
            System.out.print(trav.data + " ");
            trav=trav.next;
        }
}
}

Заключение

Мы видели разные способы объединения двух списков в Java. Они варьируются от встроенных функций до базовых циклов for. Последний приведенный выше пример дает более глубокое понимание того, как работают списки в Java. Используя подход последнего примера, вы можете лучше контролировать порядок, в котором элементы отображаются в списке.