将两个已排序的Arraylists合并为一个已排序的Arraylist

时间:2015-08-05 09:53:47

标签: java sorting arraylist mergesort

我的代码应该将两个已经排序的arraylists合并为一个已排序的arraylist,如果其中一个arraylists没有排序,那么它应该返回null。

public class MergeSorted {
public static void merge(ArrayList<Integer> a, ArrayList<Integer> b) {

    for (int i = 0, j = 0; j < b.size(); i++) {
        if (i == a.size() || a.get(i) > a.get(j)) {
            a.add(i, b.get(j++));
        }
    }
}  
}

这是我尝试的但是如果它们不相等则无法获得返回null的想法,我是java的新手,这是我的第二周所以请耐心等待我。我知道我应该有一个if语句来检查它们是否已经排序,还有其他但我应该在if?

中包含什么

3 个答案:

答案 0 :(得分:1)

<强>问题

检查两个列表是否已排序,如果是,那么它会将两个列表合并为一个排序列表,而如果列表未排序则返回null。

代码解决方案:

请尝试以下代码:

public class MergeSorted {
public static List merge(List<Integer> aList, List<Integer> bList) {

    List mergeList = new ArrayList<Integer>();

    //checking if list 'A' is sorted
    List temp = new ArrayList(aList);
    Collections.sort(temp);
    boolean aSorted = temp.equals(aList);

    //checking if list 'B' is sorted
    temp = new ArrayList(bList);
    Collections.sort(temp);
    boolean bSorted = temp.equals(bList);

    //if both lists are sorted then merge them
    if(true == aSorted && true == bSorted) {
        mergeList.addAll(aList);
        mergeList.addAll(bList);
        Collections.sort(mergeList);
    }

   return mergeList; 
    }
  }

答案 1 :(得分:0)

通用方法是这样的:

public class MergeSort {

    public static <T extends Comparable<? super T>> List<T> merge(List<T> a, List<T> b) {
        if (!isSorted(a) || !isSorted(b)) {
            return null;
        }

        final List<T> result = new ArrayList<T>(a.size() + b.size());
        result.addAll(a);
        result.addAll(b);

        Collections.sort(result);

        return result;
    }

    private static <T extends Comparable<? super T>> boolean isSorted(final List<T> list) {
        T prevItem = null;
        for (T item : list) {

            if (prevItem != null && item.compareTo(prevItem) < 0) {
                return false;
            }

            prevItem = item;
        }

        return true;
    }

}

如果只需要它,你可以轻松地用Integer替换所有这些通用Ts ......

答案 2 :(得分:0)

  • 如果List实现相同,请参考此链接进行比较。请注意,您的ArrayList实施包含List<Integer>,因此排序按自然顺序进行。在等回报true或其他false的情况下。您可以根据需要更改它以返回任何标志。

Sort and compare 2 lists if equal - List of String

  • 有一些有用的Apache公共库类可以帮助您合并已排序的数组列表:这将为您提供所需的内容。 org.apache.commons.collections4包。 Apache Common Lib version 4 - collate()

例如,List<Integer> mergedList = CollectionUtils.collate(list1, list2);