如何在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);
}
}
Merge Arraylists Addall 1

请注意元素出现的顺序与调用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);
}
}
LinkedList AddAll 1

使用迭代器在Java中合并两个列表。

我们可以使用一个迭代器遍历列表并合并。

对于ArrayList: 只需一个选项

对于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 Arraylist 1

另一种合并这两个列表的方法是将一个列表的元素简单地添加到另一个列表中。除非需要保持现有数据的完整性,否则无需创建新列表。

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

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

在这种情况下,所有的元素都被添加到列表l2中。这样可以节省在创建额外列表上花费的内存。将一个列表的元素添加到另一个列表中可以节省额外的遍历。

Single Iter Merge 1

对于链表(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);
}
}
Linkedlist Merge iterator

使用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将包含合并元素的最终列表。

Forloop Arraylist 1

对于链表:

为了更好地理解链表的遍历,让我们定义一个自己的链表。

这将需要一个节点的类。一个节点需要两个东西,数据和下一个节点的地址。

类节点的代码

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

请注意,next是节点类型,因为它存储了一个节点的地址。创建和之前示例中使用的相同的两个列表:

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

这将创建类似于以下的列表:

Lists 1

每个箭头代表下一个链接。为了将两个列表连接起来,我们需要将一个列表的末尾连接到第二个列表的开头。

List Merge Graphic 1

这可以通过以下方式完成:

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;
        }
}
}
Output Forloop Lists 1

结论

我们看到了在Java中合并两个列表的不同方式。这些方式包括内置函数和基本的for循环。上面的最后一个示例对Java中列表的工作原理有更深入的理解。使用最后一个示例的方法,您可以更好地控制列表中元素出现的顺序。

发表回复 0

Your email address will not be published. Required fields are marked *


广告
将在 10 秒后关闭
bannerAds