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