![](/img/trans.png)
[英]Scala - Ids lists of objects with duplicated values from spark dataset
[英]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)。
這是最慢的方法,但最容易理解。
您應該使用TreeSet
或TreeMap
之類的排序集合,以便可以對排序集合進行比較。 然后按排序順序,您可以遍歷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.