我正在尝试删除TreeSet中某些索引可以整除的所有数字,并且我使用以下代码
TreeSet<Integer> primes = new TreeSet();
Iterator<Integer> iter = primes.iterator();
int n = 100;
for (int i = n; i > 1; i--){
primes.add(i);
}
for (int i = 2; i < Math.sqrt(n); i ++){
while (iter.hasNext()){
int next = iter.next();
if (next % i == 0){
primes.remove(next);
}
}
}
System.out.println(primes);
但由于某种原因,集合中没有元素被删除
答案 0 :(得分:2)
首先在添加素数后创建Iterator
,然后使用Iterator.remove()
来获取ConcurrentModificationException
。
TreeSet<Integer> primes = new TreeSet();
int n = 100;
for (int i = n; i > 1; i--) {
primes.add(i);
}
Iterator<Integer> iter = primes.iterator();
for (int i = 2; i < Math.sqrt(n); i++) {
while (iter.hasNext()) {
int next = iter.next();
if (next % i == 0) {
iter.remove();
}
}
}
System.out.println(primes);
答案 1 :(得分:2)
Iterator.remove()
是在迭代期间修改集合的唯一安全方法。使用iter.remove();
while (iter.hasNext()){
int next = iter.next();
if (next % i == 0){
iter.remove();
}
}
从底层集合中移除迭代器返回的最后一个元素(可选操作)。每次调用next时,只能调用一次此方法。如果在迭代正在进行中以除调用此方法之外的任何方式修改基础集合,则未指定迭代器的行为。来自ITERATOR
答案 2 :(得分:0)
您必须使用iter.remove()
,否则您将获得ConcurrentModificationException
。
在您的代码中,您使用的是primes.remove(next);
将其更改为iter.remove()
,这将删除当前的next
元素。
答案 3 :(得分:0)
使用以下代码:
TreeSet<Integer> primes = new TreeSet();
int n = 100;
for (int i = n; i > 1; i--){
primes.add(i);
}
Iterator<Integer> iter = primes.iterator();
for (int i = 2; i < Math.sqrt(n); i ++){
while (iter.hasNext()){
int next = iter.next();
if (next % i == 0){
iter.remove();
}
}
}
System.out.println(primes);
答案 4 :(得分:0)
我认为你最终会遇到并发修改异常。您正在使用迭代器迭代树集,但同时在树集上使用remove。请使用iter.remove()
从树集中删除元素。
答案 5 :(得分:0)
在将元素添加到集合后应该获取迭代器,并从Iterator中删除以避免ConcurrentModificationException:
TreeSet<Integer> primes = new TreeSet<Integer>();
int n = 100;
for (int i = n; i > 1; i--) {
primes.add(i);
}
Iterator<Integer> iter = primes.iterator();
for (int i = 2; i < Math.sqrt(n); i++) {
while (iter.hasNext()) {
int next = iter.next();
if (next % i == 0) {
// primes.remove(next); // concurrent modification exception!
iter.remove();
}
}
}
System.out.println(primes);