如何在Java中合并两个列表?

时间:2020-02-23 14:34:36  来源:igfitidea点击:

合并Java中的两个列表通常是有用的操作。
这些列表可以是ArrayLists或者LinkedLists。

如何在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;
  }
}

请注意,next是node类型的,因为它存储节点的地址。
创建与先前示例相同的两个列表:

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