将两个arraylists合并为一个arraylist

时间:2015-08-05 17:15:19

标签: java arraylist

我正在尝试制作将两个arraylists合并为一个arraylist的程序。

问题是我不能使用集合,应该硬编码。直到我来到这儿,我才能做到。有人可以试着帮我吗?

public static boolean isSorted(ArrayList<Integer> list)
{
    boolean sorted = true;        
    for (int i = 1; i < list.size(); i++) {
        if (list.get(i-1).compareTo(list.get(i)) > 0) {
            sorted = false;
        }
    }
    return sorted;
}

public static ArrayList<Integer> merge(ArrayList<Integer> a, ArrayList<Integer> b) {
    int num;
    boolean ASorted = isSorted(a);
    boolean BSorted = isSorted(b);
    ArrayList<Integer> c = new ArrayList<Integer>();


    if(ASorted == false || BSorted == false) {
        return null;

    } else {
        for(int i = 0; i < b.size(); i++){
            c.add(b.get(i));
        }
        for (int j = 0; j < a.size(); j++){
            num = a.get(j);
            if (num < c.get(j) ){
                c.add(j, num);
            } else if(j == 5|| num > c.get(j) ){
                c.add(j+2, num);
            }
        }
        return c;
    }
}

打印:

[1, 4, 7, 8, 9, 6]

使用时:

7 8 9 and 1 4 6

4 个答案:

答案 0 :(得分:0)

这会将两个列表一起添加到一个列表中。您可以在此处应用任何类型的逻辑:

List<T> tList = new ArrayList<T>();
for (T element : listA) {
    tList.add(element);
}
for (T element : listB){
    tList.add(element);
}

如果需要使用迭代器,可以这样做:

List<T> tList = new ArrayList<T>();
Iterator<T> fIt = listA.iterator();
while (fIt.hasNext()){
    tList.add(fIt.next());
}
Iterator<T> fIt2 = listB.iterator();
while (fIt2.hasNext()){
    tList.add(fIt2.next());
}

答案 1 :(得分:0)

假设您的合并方法也是为了保留返回的result列表中的顺序,那么您的解决方案应该看起来像

while both lists have elements 
  pick top elements from lists say aInt, bInt
  compare them 
    place smaller one in result array
    move to next element in list which element was placed in result
when only one list will remain with elements
  place them in result   

答案 2 :(得分:0)

这可能是您教授想要的,可以根据需要更改代码。你没有提及排序,所以我并不担心。我必须告诉你,这不是接近真实标准(在工作中),所以不是任务。希望它现在可以帮到你。

package dummy;

import java.util.ArrayList;

public class DummyList {

    final static ArrayList<Integer> list1 = new ArrayList<Integer>();
    final static ArrayList<Integer> list2 = new ArrayList<Integer>();

    private static ArrayList<Integer> merge(ArrayList<Integer> l1, ArrayList<Integer> l2) {
        ArrayList<Integer> list = new ArrayList<Integer>();

        for (Integer integer : l1) {
            list.add(integer);
        }

        for (Integer integer : l2) {
            if(!list.contains(integer))
                list.add(integer);
        }

        return list;
    }

    public static void main(String[] args) {
        list1.add(1);
        list1.add(3);
        list1.add(6);

        list2.add(2);
        list2.add(4);
        list2.add(6);

        ArrayList<Integer> mergedList = merge(list1, list2);
        System.out.println(mergedList);
        //sort here if needed.
    }

}

答案 3 :(得分:0)

如果您喜欢自己的方式,请更换您的&#39; j&#39;通过以下循环:

for (int j = 0; j < a.size(); j++) {
    num = a.get(j);
    for (int k = 0; k < c.size(); k++) {
        if (num <= c.get(k)) {
            c.add(k, num);
            break;
        } else if (k + 1 == c.size()) {
            c.add(k + 1, num);
            break;
        }
    }
}

你必须添加额外的循环&#39; k&#39;输出列表。 你可以将它与我喜欢的逻辑进行比较:

public static ArrayList<Integer> merge3(ArrayList<Integer> a, ArrayList<Integer> b)
{
    if (!isSorted(a) || !isSorted(b))
    {
        return null;
    }
    else
    {
        ArrayList<Integer> c = new ArrayList<Integer>();
        for (int ai = 0, bi = 0; ai < a.size() || bi < b.size();)
        {
            if (bi == b.size() || (ai < a.size() && a.get(ai) <= b.get(bi)))
            {
                c.add(a.get(ai++));
            }
            else if (ai == a.size() || (bi < b.size() && b.get(bi) <= a.get(ai)))
            {
                c.add(b.get(bi++));
            }
        }
        return c;
    }
}

它与Pshemo提出的逻辑相同