웹사이트 검색

Java에서 두 목록을 병합하는 방법은 무엇입니까?


Java에서 두 목록을 병합하는 것은 종종 유용한 작업입니다. 이러한 목록은 ArrayList 또는 LinkedList일 수 있습니다.

Java에서 두 목록을 병합하는 방법

Java에서 두 목록을 병합할 수 있는 여러 가지 방법이 있습니다. 작업을 완료하기 위한 몇 가지 간단한 방법을 살펴보겠습니다!

1. 두 목록을 병합하는 addAll() 메서드

addAll() 메서드는 두 목록을 병합하는 가장 간단하고 일반적인 방법입니다.

ArrayList의 경우:

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()이 호출되는 순서와 일치합니다.

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<>();
        merged.addAll(L1);
        merged.addAll(L2);

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

2. 반복자를 사용하여 Java에서 두 목록 병합

Iterator를 사용하여 목록을 순회하고 병합할 수 있습니다.

ArrayList의 경우:

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

Iterator는 먼저 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 루프는 두 목록을 병합하는 데에도 유용합니다.

ArrayList의 경우:

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

루프는 ArrayList를 모두 순회하고 새로 생성된 목록에 각 요소를 하나씩 추가합니다.

한 목록의 요소를 다른 목록에 추가하면 추가 순회가 저장됩니다.

 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에서 목록이 작동하는 방식을 더 깊이 이해할 수 있도록 합니다. 마지막 예제의 접근 방식을 사용하면 목록에 요소가 나타나는 순서를 더 많이 제어할 수 있습니다.