2017-06-22 62 views
-3

在我的項目中,我使用了兩次removeAll方法。在第二次我必須使用列表的副本,因爲源列表通過首次使用removeAll方法進行修改。有沒有辦法做到這一點,而不做副本的清單?removeAll - 修改源列表

val apiIdListCopy: MutableList<Int> = apiIdList 

apiIdList.removeAll(dbIdList) 
dbIdList.removeAll(apiIdListCopy) 

編輯: 對於未來的觀衆,我發現簡單的解決方案在科特林

val api: List<Int> = apiIdList.stream().filter{item -> !dbIdList.contains(item)}.collect(Collectors.toList()) 
val db: List<Int> = dbIdList.stream().filter{item -> !apiIdList.contains(item)}.collect(Collectors.toList()) 
+4

這裏的實際問題是什麼? –

+0

我同意。我*嘗試*寫出答案;但我真的不明白你的問題。當你不想刪除元素時,刪除元素有什麼意義? – GhostCat

+0

@OliverCharlesworth我編輯了問題 – AKZB

回答

-1

在我看來,那是你真正想實現的是讓這兩個表之間的差異。除非列表非常短,否則由於移除的複雜性,您嘗試執行操作的方式極其低效。

我的建議是使用設置,而不是列表,然後利用番石榴設置方法:

SetView<Integer> onlyInApi = Sets.difference(apiIdSet, dbIdSet); 
SetView<Integer> onlyInDb = Sets.difference(dbIdSet,apiIdSet); 

這樣,您創建包含兩個集合你有興趣的差異集,但沒有實際做副本(因爲它們是視圖,並且仍然受到原始集合的支持)。

上面的例子是java,而不是kotlin,但轉換應該是微不足道的。

+0

非常感謝! Dzięki! :) – AKZB

+0

這裏不需要番石榴 – voddan

1

所有你需要的是已經被科特林提供:

val onlyInApi = apiIdList - dbIdList 
val onlyInDb = dbIdList - apiIdList 

-操作符對Iterable,這樣你就可以把它應用到列表或集。請注意,它使用引擎蓋下的套件,所以它與使用Guava的Sets.difference一樣有效。

+0

哇,謝謝!我不知道這可以以非常簡單的方式完成。 – AKZB

+0

它不是在內部創建副本嗎?其中一個要求是避免複製列表。 –

+0

在列表上操作時,它將一個列表轉換爲一個集合,然後將結果收集到一個新列表中。我相信那些內褲是可以接受的(看問題的編輯) – voddan