[英]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.