[英]Removing matching elements of a TreeSet
我正在嘗試刪除與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);
但是由於某些原因,集合中的任何元素都不會被刪除
添加素數后,首先創建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);
Iterator.remove()
是在迭代過程中修改集合的唯一安全方法。 使用iter.remove();
while (iter.hasNext()){
int next = iter.next();
if (next % i == 0){
iter.remove();
}
}
從基礎集合中移除迭代器返回的最后一個元素(可選操作)。 每次調用next只能調用一次此方法。 如果在迭代進行過程中以其他方式(而不是通過調用此方法)修改了基礎集合,則未指定迭代器的行為。 來自ITERATOR
您必須使用iter.remove()
否則將獲得ConcurrentModificationException
。
在您的代碼中,您正在使用primes.remove(next);
將其更改為iter.remove()
,它將刪除當前的next
元素。
使用以下代碼:
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);
我認為您應該以並發修改異常結束。 您正在使用迭代器迭代樹集,但同時在樹集上使用remove。 請使用iter.remove()
從樹集中刪除該元素。
將元素添加到集合中后,應獲取迭代器,並從迭代器中刪除以避免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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.