簡體   English   中英

迭代時從HashSet中刪除元素

[英]Remove elements from HashSet on iteration

假設我有一個HashSet

[1, 2, 3, 4, 5, 6]

我想以這樣的方式迭代它,對於給定的總和,比如6,在遍歷元素時,如果我在Set中找到2個元素,其中sum = 6,我想刪除另一個。 E. g。,如果我迭代超過1,我應該刪除5.我試圖做這樣的事情:

HashSet<Integer> hs = new HashSet(arr);
int sum = 6;
for(int num : hs) {
    if(hs.contains(sum - num)) {
        hs.remove(sum - num);
    }
}

顯然它會拋出java.util.ConcurrentModificationException 另一種方法是使用迭代器,但它會刪除當前元素,並且不會將任何其他元素作為參數。 我還能用什么?

更新:我知道使用附加設置和所有技術的技巧。 如果可能的話,我只想要一個非常優化的解決方案,而不會增加時間和空間的復雜性。

保留一組正在運行的數字。

這將允許您擁有一次通過的解決方案。

從空運行集開始,遍歷您的數字集。 對於迭代的每個元素,如果它的sum-compliment在集合中,則從迭代器中刪除它。 否則,將其添加到正在運行的集合中。

HashSet<Integer> hs = new HashSet(arr);
HashSet<Integer> running = new HashSet();
int sum = 6;
Iterator<Integer> iter = hs.iterator();
while (iter.hasNext()) {
    int num = iter.next();
    if (running.contains(sum - num)) {
        iter.remove();
    } else {
        running.add(num);
    }
}

此代碼將修改原始HashSet ,並且兩個HashSet將在代碼塊的末尾包含相同的內容。 在這種情況下,最好只使用代碼末尾的running集而不是修改原始集。 這將使這段代碼更加靈活和可重用。

您可以使用排序列表。 首先按遞增順序對數字進行排序。 然后你將2個迭代器放在第一個元素中,將另一個放在最后一個元素中。 然后在每一步中,如果迭代器下的2個項的總和小於你想要的數,你應該增加第一個迭代器,如果它應該減少第二個迭代器,如果它等於你想要的你選擇它們並先增加並減少第二個迭代器。

它比套裝更快!

暫無
暫無

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

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