如何将两个arraylists按升序合并为一个

时间:2014-02-03 22:59:18

标签: java list loops arraylist

我需要将两个列表合并为一个,按升序排列,而不是重复,我认为我的代码非常接近,我只是遗漏了一些东西,我无法弄明白。截至目前,我的代码在合并方法中无法正常运行。我认为它与我的循环有关,但我无法解决它。我当前的方法打印新列表,但它没有完美的增加顺序。我很感激任何帮助,找出如何使用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();
    }
}
}

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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] =&gt;你的合并会看起来像[1 1 1 2 1 2])

然后,在你的“并行”for循环(你正在遍历两个列表的那个循环)之后,你的一个索引总是打破你的循环,因为它在它的列表的末尾。对于有序合并,我通常在循环之外声明i,j(你需要在第一个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循环之后,你到达其中一个列表的末尾(某人将要打破循环),所以上述循环的一个将被执行,并按顺序包含剩余的项目。

编辑:你的最后一个for循环的merge()方法不正确。