合并两个已排序的ArrayLists

时间:2017-04-03 20:29:56

标签: java sorting arraylist merge

我应该创建一个方法,将两个给定的预先排序的字符串列表合并为一个。所有这一切都必须在一个循环中完成。我的方法是比较每个索引处的两个ArrayLists,并根据这些比较按字母顺序添加它们。这个问题是,如果给你两个ArrayLists [“Bob”,“Jill”]和[“Watson”,“Zane”],输出将是[“Bob”,“Watson”,“Jill”,“赞恩“。这显然没有分类。

话虽如此,我知道问题是什么,我只是不知道如何实现它的修复。

代码:

public static ArrayList<String> merge(ArrayList<String> al1, ArrayList<String> al2){
  ArrayList<String> al = new ArrayList<String> (al1.size() + al2.size());
  for (int i = 0; i < Math.max(al1.size(), al2.size()); i++) { // Loops until max size of the two arraylists is reached
      if (i < al1.size() && i < al2.size()) { // Checks if the index is still in range of both arraylists
          if (al1.get(i).compareTo(al2.get(i)) < 0) { // Compares the two arraylists at the same index
              al.add(al1.get(i));
              al.add(al2.get(i));
          } else {
              al.add(al2.get(i));
              al.add(al1.get(i));
          }
      } else if (i < al1.size() && i > al2.size()) { // Checks if the index is greater than the size of al2
          al.add(al1.get(i));
      } else { // Anything else, just add al2
          al.add(al2.get(i));
      }
  }
  return al;

3 个答案:

答案 0 :(得分:0)

您正在使用一个索引i来索引a1a2,这意味着您无法独立浏览这两个列表。正如您所注意到的那样,应该通过从第一个列表中获取所有三个元素来合并一对列表[1, 2, 3][4, 5, 6],然后然后从第二个列表中获取元素。通过同时遍历两个列表,这是不可能的。

而是跟踪两个单独的标记,例如i1i2,并单独递增它们。在每次迭代时,确定哪个索引较小,添加该值并增加该索引。一旦你到达一个列表或另一个列表的末尾,你只需要排空剩余的列表。

答案 1 :(得分:0)

你应该看看合并排序算法的合并步骤: https://en.wikipedia.org/wiki/Merge_sort

总而言之,你应该有类似的东西:

int i = 0;
int j = 0;
while (i < a.size() && j < b.size()) {
    if (a.get(i).compareTo(b.get(j)) <= 0) {
        result.add(a.get(i));
        ++i;
    } else {
        result.add(b.get(j));
        ++j;
    }
}

for (; i < a.size(); ++i) {
    result.add(a.get(i));
}

for (; j < a.size(); ++j) {
    result.add(b.get(j));
}

return result;

不要测试它,但结果你应该有一些看起来相同的东西

答案 2 :(得分:0)

public static ArrayList<Double> merge(ArrayList<Double> a, ArrayList<Double> b) {

    ArrayList<Double> toReturn = new ArrayList<Double>();
    int a_ = 0;
    int b_ = 0;

    for(int j = 0; j < a.size() + b.size(); j++) {
        if(a_ == a.size())
            toReturn.add(b.get(b_++));
        else if(b_ == b.size())
            toReturn.add(a.get(a_++));
        else if(a.get(a_).compareTo(b.get(b_)) < 0)
            toReturn.add(a.get(a_++));
        else
            toReturn.add(b.get(b_++));
    }

    return toReturn;
}