Рубрики
Без рубрики

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

Как объединить два списка в Java. Существуют различные способы объединения нескольких списков в Java – итераторе, например, в примерах метода loop, Collection addAll ().

Автор оригинала: Pankaj Kumar.

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

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

Существует несколько способов объединить два списка в Java. Давайте рассмотрим некоторые из простых способов выполнения вашей работы!

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

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

Для ArrayList:

import java.util.ArrayList;

public class Main {

    public static void main(String[] args)
    {
ArrayList l1 = new ArrayList();
        l1.add(1);
        l1.add(3);
        l1.add(5);
ArrayList l2 = new ArrayList();
        l2.add(2);
        l2.add(4);
        l2.add(6);
ArrayList merge = new ArrayList();
        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 L1 = new LinkedList<>();
        L1.add(1);
        L1.add(3);
        L1.add(5);
LinkedList L2 = new LinkedList<>();
        L2.add(2);
        L2.add(4);
        L2.add(6);
LinkedList 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

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

Для ArrayList:

import java.util.ArrayList;

public class Main {

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

ArrayList 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);
}
}

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

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

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

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

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

Для Связанного Списка:

import java.util.LinkedList;

public class Main {

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

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

Для цикла также полезно объединить два списка.

Для ArrayList:

import java.util.ArrayList;

public class Main {

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

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

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

 for(int i=0;i

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

Для Связанного Списка:

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

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

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

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” инициируется и указывается в начале первого списка. Первый список просматривается до тех пор, пока трев не достигнет конца первого списка.

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

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

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. Они варьируются от встроенных функций до базовых для циклов. Последний пример выше дает более глубокое понимание того, как списки работают в Java. Используя подход, описанный в последнем примере, вы можете лучше контролировать порядок, в котором элементы отображаются в списке.