簡體   English   中英

刪除TreeSet的匹配元素

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

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