【问题标题】:How to merge two arraylists into one in ascending order如何将两个数组列表按升序合并为一个
【发布时间】:2014-02-03 22:59:18
【问题描述】:

我需要将两个列表合并为一个,按升序排列,而不是重复,我认为我的代码非常接近,我只是遗漏了一些东西,我无法弄清楚。截至目前,我的代码在我的 merge 方法中无法正常工作。我认为这与我的循环有关,但我无法解决它。我当前的方法打印新列表,但它不是完美的递增顺序。在弄清楚如何使用 l1 和 l2 的内容以升序打印我的合并列表时,我将不胜感激。

**注意:我不能使用任何内置的数组排序方法。

谢谢!

import java.util.ArrayList;
import java.util.Random;

public class MergeLists {

    public static ArrayList<Integer> merge(ArrayList<Integer> l1, ArrayList<Integer> l2){        
    ArrayList<Integer> mergedList = new ArrayList();
    for (int j = 0; j < l1.size(); j++) {
        if (l1.get(j) < l2.get(j)) {
            mergedList.add(l1.get(j));
            mergedList.add(l2.get(j));
        } else {
            mergedList.add(l2.get(j));
            mergedList.add(l1.get(j));
        }
    }
    for (int i = l2.size() - l1.size(); i < l2.size(); i++) {
        mergedList.add(l2.get(i));
    }
    return mergedList;
}

public static ArrayList<Integer> makeRandomIncreasingList(int length) {
    ArrayList<Integer> randomList = new ArrayList();
    Random rand = new Random();
    int inList = rand.nextInt(9) + 1;
    int inList2 = rand.nextInt(9) + 1;
    for (int i = 0; i < length; i++) {
        randomList.add(inList);
        inList = inList + inList2;
    }
    return randomList;
}

public static void doMergeTest() {
    ArrayList<Integer> list1 = makeRandomIncreasingList(10);
    ArrayList<Integer> list2 = makeRandomIncreasingList(20);
    ArrayList<Integer> mergedList = merge(list1, list2);
    System.out.println("List 1:" + list1);
    System.out.println("List 2:" + list2);
    System.out.println("Merged list:" + mergedList);
}

public static void main(String[] args) {
    for (int i = 0; i < 10; i++) {
        System.out.println("Performing merge test #" + (i + 1) + ":");
        doMergeTest();
    }
}
}

【问题讨论】:

    标签: java list loops arraylist


    【解决方案1】:

    删除重复项

    arrayList1.remove(arrayList2);
    

    然后合并两个arrayList:

    arrayList1.addAll(arrayList2);
    

    最后对最后一个进行排序

    collections.sort(arrayList1);
    

    另一种方法是使用 SET:Set 不允许重复
    (HashSet 更快取决于 List 实现类)

    Set setmerge = new HashSet(list1);
    
    setmerge.addAll(list2);
    
    list1.clear();
    
    list1.addAll(setmerge);
    

    【讨论】:

      【解决方案2】:

      你的 merge() 方法的第一部分似乎没问题,如果你稍微修改一下。您需要同时浏览 两个 列表,例如

      int i = 0, j = 0;
      for (; i < l1.size() && j < l2.size();)
      

      并独立比较单个项目和增量索引,如

      if (l1.get(i) < l2.get(j)) {
          ...
          i++;
      } else
          ...
          j++;
      }
      

      你这样做的方式是字面上并行进行,这并不总是正确的(想想列表 [1 2 2] 和 [1 1 1] => 你的合并看起来像[1 1 1 2 1 2])

      然后,在您的“并行”for 循环(遍历两个列表的循环)之后,您的索引之一总是会中断您的循环,因为它位于其列表的末尾。对于按顺序合并,我通常在循环外声明 i, j (你需要 then 在你的第一个 for 循环之后,如上),然后做类似的事情(在你的符号中):

      for (int i1 = i; i1 < l1.size(); i1++) {
          mergeList.add(l1.get(i1));
      }
      
      for (int i2 = j; i2 < l2.size(); i2++) {
          mergeList.add(l2.get(i2));
      }
      

      在你的第一个 for 循环之后,你会到达一个列表的末尾(有人会打破循环),所以上述循环中的 一个 将被执行,这将按顺序包含剩余的项目。

      编辑:merge() 方法的最后一个 for 循环不适合您的目的。

      【讨论】:

      • 我的最终代码与您的指令完美配合。很有帮助。
      【解决方案3】:

      您假设 l2 项总是大于 l1 项,因为您要在列表末尾添加剩余的 l2 项。您需要将它们与 mergeList 项进行比较并相应地添加它们。

      【讨论】:

        猜你喜欢
        • 2014-02-13
        • 2022-01-13
        • 1970-01-01
        • 1970-01-01
        • 2019-11-18
        • 2013-11-12
        • 2015-07-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多