簡體   English   中英

從兩個列表中刪除非重復的對象

[英]Remove NOT duplicated objects from two lists

嗯,我讀了很多關於從刪除重復值lists ,但沒有關於維護那些事實上在另一個列表復制 我將嘗試解釋我的問題:

我必須從數據庫中讀取一些值,並保存與我的搜索條件匹配的每個條目(整數條目)。 此操作是循環操作,因此已完成n次。 返回的對象必須是一個List(或ArrayList,或者對於我而言最合適的任何列表實現)。

為了清楚起見 ,一些偽代碼

for (int i=0; i<nElements; i++) {

    tempList = getEntriesFromDb(i);

    if (i==0)
     result=tempList;

    else 
     //this is where I should maintain those entries that are in fact duplicated
     // in both tempList and result
     result = maintainDuplicates(result,tempList);

    }

retun result;

我想知道一些有關我的問題的建議。 問題是,我可以做一個新的循環來從列表中提取每個條目,創建一個(第三個!!) 臨時列表以將其保存在該列表中,等等。但是我真的知道,這將導致瓶頸我的實現。

任何幫助將不勝感激,在此先感謝。

此處的關鍵操作是在一個列表中查找另一個列表中的每個元素。 這可能是一個緩慢的操作。 如果列表很長,我建議創建一個HashSet workingHash ,其中包含一個列表的所有元素,然后對另一個列表執行retainAll(workingHash)。

您可以開始迭代list1元素,當前元素需要在list2中進行驗證( index = list2.indexOf(curElementInList1)如果index> -1,然后將其添加到結果中(list3)。

這是最慢的方法,但最容易理解。

您應該使用TreeSetTreeMap之類的排序集合,以便可以對排序集合進行比較。 然后按排序順序,您可以遍歷2個集合(按其排序),這將幫助您在2n時間(即o(n)時間)內找到重復的元素。

例如,如果您的DB結果為1,3,5,7,9,11,13,15而tempList為2 5 8 11

您可以同時開始迭代數據庫結果和tempList。 從第一個元素1-2開始,因此tempList不存在1,因此1不是重復的,依此類推。 因此,比較和結果將是這樣。

1-2刪除1.由於數據庫結果元素少於tempList元素,請獲取下一個數據庫結果ele

3-2不移除。 tempList元素少於數據庫結果元素,獲取下一個tempList元素,依此類推

3-5刪除3.由於數據庫結果元素少於tempList元素,請獲取下一個數據庫結果ele

5-5兩者相同,因此移至兩者中的下一個元素。

7-8因為數據庫結果元素少於tempList元素,所以獲取下一個數據庫結果ele

9-8不移除。 tempList元素少於數據庫結果元素,獲取下一個tempList元素,依此類推

9-11刪除9.由於數據庫結果元素少於tempList元素,請獲取下一個數據庫結果ele

11-11兩者相同,因此移至兩者中的下一個元素。

因此,這就是您將獲得5,11的方式。

用這個:

result.retainAll(tempList);

暫無
暫無

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

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