1

在我的作业中,第三步是调用方法 merge 来合并 list1 中的两个列表,以便 list1保持排序状态。

我写了我的代码,但它不能很好地工作,输出显示错误,因为排序很重要

 public static void merge (ArrayList<Integer> list1, ArrayList<Integer> list2)
 {
        int i;
        int n=list1.size();
        int pos , j=0;

        for (pos =0 ;pos<n ; pos++)
        {
            for ( i=0 ; i<n ; i++)
                if (list1.get(j)>list2.get(pos))
                    list1.add(pos,list2.get(pos));
                else 
                    j++;
       } 
 }
4

7 回答 7

10

假设两个列表都已排序,您只需要一个for循环:

public static void merge(List<Integer> l1, List<Integer> l2) {
    for (int index1 = 0, index2 = 0; index2 < l2.size(); index1++) {
        if (index1 == l1.size() || l1.get(index1) > l2.get(index2)) {
            l1.add(index1, l2.get(index2++));
        }
    }
}  

如果l2未排序,则需要两个循环:

public static void merge(List<Integer> l1, List<Integer> l2) {
    for (int index2 = 0; index2 < l2.size(); index2++) {
        for (int index1 = 0; ; index1++) {
            if (index1 == l1.size() || l1.get(index1) > l2.get(index2)) {
                l1.add(index1, l2.get(index2));
                break;
            }
        }
    }
}
于 2012-10-25T13:48:02.153 回答
2

轻松修复:事后排序。

list1.addAll(list2);
Collections.sort(list1);

使用集合来避免重复。

于 2012-10-25T13:32:34.603 回答
1
public static void merge (ArrayList<Integer> list1, ArrayList<Integer> list2)
{
    list1.addAll(list2);
    Collections.sort(list1);
}
于 2012-10-25T13:35:40.780 回答
0

合并列表后,调用排序方法如下。

Collections.sort(list1); // carries out natural ordering.

如果您需要自定义排序,请使用 Comparator 对象

Collections.sort(list1, comparatorObject);

检查比较器示例以获取更多详细信息。

这是您修改后的代码:

 public static void merge (ArrayList<Integer> list1, ArrayList<Integer> list2)
 {
    list1.add(list2); //merges list 2 to list1
    Collections.sort(list1); //natural ordering
 }
于 2012-10-25T13:33:09.190 回答
0

如果您的输入列表不是太长,我建议只合并列表并使用Collections.sort()方法来恢复顺序:

public static void mergeAndSort(List<Integer> list1, List<Integer> list2) {
    List<Integer> combinedList = new ArrayList<Integer>(list1);
    combinedList.addAll(list2);
    Collections.sort(combinedList);
    return combinedList;
}

作为旁注,您应该尽可能使用List接口而不是ArrayList实现类。

于 2012-10-25T13:37:19.700 回答
0
public list mergeAndSort(List<integer> list1, List<integer> list2){
List<integer> list3;
int list2Size = list2.size();
for(int i=0;i<list2Size;i++){
    list1.add(list2(i));  
}
// Here we got all the elements in 1 list i.e list1

int list1Size = list1.size();
for(i=0;i<list1Size;i++){
    int small = 0;
    for(int j=i;j<list1size;j++){
        if(list1(i)> list2(j)){
            small = list2(j;
        }
    }
    list3.add(small); //Smallest 1 will be added to the new list
}

}

于 2016-04-27T02:30:42.433 回答
-1
     ArrayList<Integer> a = new ArrayList();
     ArrayList<Integer> b = new ArrayList();
     ArrayList<Integer> c = new ArrayList();

     a.add(1);
     a.add(3);
     a.add(5);
     a.add(7);
     a.add(17);
     a.add(27);
     a.add(37);

     b.add(0); 
     b.add(2);
     b.add(4);

     while( a.size() > 0 || b.size() >0){

        if( a.size() == 0 || b.size() == 0){
            c.addAll(b);
            c.addAll(a);
            break;
        }

        if(a.get(0) < b.get(0)){
            c.add(a.get(0));
            a.remove(0);
        }
        else{
            c.add(b.get(0));
            b.remove(0);
        }

    }

    System.out.println(c.toString());
于 2015-07-03T00:26:27.047 回答