簡體   English   中英

如何比較兩個有序列表

[英]How to compare two ordered lists

ArrayList thisDataList 和 dataList 是兩個包含大量數據的有序列表。 “不同”是一個 ArrayList 數組,它將包含在我們在 thisDataList 中但不在 dataList 中的第一行數據中,在第二行中將包含我們在 dataList 中但不在 thisDataList 中的數據,我使用此方法與小數據但不超過 50Mo 的文件,你能給出一個解決方案,我使用我已經“排序”列表更快的事實來制作相同的算法?

我正在使用 Java 1.6

ArrayList<?>[] different = new ArrayList<?>[2];
ArrayList<String> tmp= new ArrayList<String>(thisDataList);

thisDataList.removeAll( dataList );
different[0]=new ArrayList<String>(thisDataList);

thisDataList= tmp;
dataList.removeAll( thisDataList );

different[1]=new ArrayList<String>(dataList);

從列表的第一個元素開始。 對於每個列表中當前索引處的元素,如果一個元素小於另一個元素,那么它對該列表是唯一的(因為列表已排序,而另一個列表永遠無法在更遠的地方找到這個較小的元素),因此遞增列出當前index 並將該元素添加為該列表的“額外”,使用新的當前索引重復。

見下文:

public static void main(String[] args) {
    List<Integer> list1 = Arrays.asList(1, 2, 4, 6, 7, 8);
    List<Integer> list2 = Arrays.asList(1, 3, 4, 5, 6, 9);

    List<List<Integer>> listExtras = getExtraElementsOfLists(list1, list2);
    List<Integer> list1Extras = listExtras.get(0);
    List<Integer> list2Extras = listExtras.get(1);

    System.out.println("List 1 extras:");
    for (Integer i : list1Extras)
        System.out.println(i);

    System.out.println();
    System.out.println("List 2 extras:");
    for (Integer i : list2Extras)
        System.out.println(i);
}


public static <T extends Comparable<T>> List<List<T>> getExtraElementsOfLists(List<T> list1,
        List<T> list2) {
    Collections.sort(list1);
    Collections.sort(list2);

    List<T> list1Extras = new ArrayList<>();
    List<T> list2Extras = new ArrayList<>();
    int index1 = 0;
    int index2 = 0;
    while (index1 < list1.size() && index2 < list2.size()) {
        T value1 = list1.get(index1);
        T value2 = list2.get(index2);
        int delta = value1.compareTo(value2);
        if (delta < 0) { // val1 < val2, list2 !contain val1
            list1Extras.add(value1);
            index1++;
        } else if (delta > 0) { // val1 > val2, list1 !contain val2
            list2Extras.add(value2);
            index2++;
        } else { // both have the same value
            index1++;
            index2++;
        }
    }
    // whichever list still has elements, add them all to its extras
    for (; index1 < list1.size(); index1++)
        list1Extras.add(list1.get(index1));
    for (; index2 < list2.size(); index2++)
        list2Extras.add(list2.get(index2));

    return Arrays.asList(list1Extras, list2Extras);
}

除了排序,時間復雜度是linear

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM