gpt4 book ai didi

java - 迭代集合 - 删除其他元素

转载 作者:行者123 更新时间:2023-12-01 10:01:04 25 4
gpt4 key购买 nike

如果我不仅想删除迭代器现在指向的元素,还想删除另一个元素,我该怎么办?任务是写出总和达到某个值的对(它们存储在 HashSet 集合中)。想法:遍历集合,找到总和达到我需要的第二个元素,将它们写出来并从集合中删除。我的意思是,如果我的集合是: [1,2,3] 且 int sum = 4,那么我会迭代,找到第一个元素:1,检查 4 - 1 = 3,写出 (1,3),然后我想从集合中删除 1 和 3,以便只剩下 {2}。我当然不能那样做:

while (itr.hasNext()) {
int elem = itr.next();
int toSum = sum - elem;
if (set.contains(toSum)) {
System.out.println("(" + elem + "," + toSum + ")");
}
itr.remove();
set.remove(toSum);
}

由于并发异常。我找到了解决方案:

while (itr.hasNext()) {
HashSet<Integer> notNeeded = new HashSet<Integer>();
int elem = itr.next();
if (notNeeded.contains(elem)) {
itr.remove();
}
else {
int toSum = sum - elem;
if (set.contains(toSum)) {
System.out.println("(" + elem + "," + toSum + ")");
notNeeded.add(toSum);
}
itr.remove();
}
}

但这看起来并不优雅和高效(尤其是空间效率)。有没有更好的方法来做到这一点?

最佳答案

我建议使用使用过的值进行第二组。然后您可以决定是否在最后将它们从原始集合中实际删除。

Set<Integer> set = new HashSet<>(Arrays.asList(1,2,3,4,5,6));
int target = 7;

Set<Integer> used = new HashSet<>();
for (Integer value1 : set) {
if (used.contains(value1))
continue; // already processed
Integer value2 = target - value1;
if (! value2.equals(value1) && set.contains(value2)) {
used.add(value1);
used.add(value2);
System.out.println("(" + value1 + "," + value2 + ")");
}
}
set.removeAll(used); // optional

通过使其非破坏性,您可以将该集重复用于其他搜索:

private static void listPairs(Set<Integer> set, int target) {
System.out.print(target + ": ");
Set<Integer> used = new HashSet<>();
for (Integer value1 : set)
if (! used.contains(value1)) {
Integer value2 = target - value1;
if (! value2.equals(value1) && set.contains(value2)) {
used.add(value1);
used.add(value2);
System.out.print("(" + value1 + "," + value2 + ")");
}
}
System.out.println();
}
public static void main(String[] args) {
Set<Integer> set = new HashSet<>(Arrays.asList(1,2,3,4,5,6));
listPairs(set, 7);
listPairs(set, 6);
listPairs(set, 5);
}

输出

7: (1,6)(2,5)(3,4)
6: (1,5)(2,4)
5: (1,4)(2,3)

关于java - 迭代集合 - 删除其他元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36802978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com