Javaで2つのリストをマージする方法は?
Javaでの2つのリストのマージは、しばしば便利な操作です。これらのリストは、ArrayListまたはLinkedListであることがあります。
Javaで2つのリストをマージする方法
複数の方法がありますが、Javaでは2つのリストを結合することができます。仕事を完了するために簡単な方法の中からいくつかを探ってみましょう!
1. 2つのリストをマージするためのaddAll()メソッド
addAll()メソッドは、2つのリストをマージする最もシンプルで一般的な方法です。
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()が呼び出される順序と一致していることに注意してください。
リンクリストについて:
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で2つのリストをマージするために、イテレータを使用する。
私たちはイテレーターを使用してリストをトラバースしてマージすることができます。
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);
}
}
イテレーターは最初にArrayList l1をトラバースし、すべての要素をItmergeに追加し、その後ArrayList l2をトラバースし、すべての要素をItmergeに追加します。
二つのリストをマージする別の方法は、単に一方のリストから要素を他方のリストに追加することです。既存のデータを保持する必要がない場合は、新たにリストを作成する必要はありません。
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<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. ループを使って複数のリストをマージする。
ループも2つのリストを結合するのに便利です。
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を走査し、各要素を新しく作成したリストに1つずつ追加します。
一つのリストの要素を別のリストに追加することで、余分な走査を省くことができます。
for(int i=0;i<l2.size();i++){
l1.add(l2.get(i));
}
System.out.println(l1);
この for ループは、l2 の要素を1つずつ l1 に追加します。この場合、l1 にはマージされた要素の最終リストが含まれます。
リンクリストについてのオプションは次の通りです。
リンクリストのトラバースを少し理解するために、独自のリンクリストを定義してみましょう。
これには、ノード用のクラスが必要です。ノードは、データと次のノードのアドレスの2つの要素が必要です。
クラスノードのコード:
public class node {
int data;
node next;
public node(int data){
this.data=data;
next=null;
}
}
以前の例で使用されたのと同じ2つのリストを作成するため、次のはノード型ですということに注意してください。
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;
}
}
以下のようなリストを作成します。
各矢印は次のリンクを表しています。2つのリストをつなげるために、最初のリストの末尾を2つ目のリストの先頭にリンクさせる必要があります。
以下のように行うことができます:
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で2つのリストをマージする異なる方法を見ました。これらは、組み込みの関数から基本的なforループまで様々です。上記の最後の例は、Javaでリストがどのように動作するかをより深く理解するのに役立ちます。最後の例の方法を使うと、要素がリストに表示される順序をより制御することができます。