2013-12-17 2 views
2

나는 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

제안을 ".", "" "?" 및 ","는 Java뿐만 아니라 영어로도 절대 유효한 문자입니다. :-) – peterh

+0

TreeSet 대신 BitSet을 사용해야합니다. TreeSet은 약 500 배의 메모리를 사용하며 이와 같은 사소한 예에서도 훨씬 느립니다. –

답변

2

먼저 소수를 추가 한 후 Iterator을 만든 다음 을 얻지 못하도록 Iterator.remove()을 사용하십시오.

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); 
0

당신은 그렇지 않으면 당신은 ConcurrentModificationException의를 얻을 수 있습니다 iter.remove()을 사용해야합니다. 코드에서

당신은 현재 next 요소를 제거합니다 iter.remove()-primes.remove(next);

변경을 사용하고 있습니다.

2

Iterator.remove()은 반복 중에 컬렉션을 수정하는 유일한 방법입니다. 사용 iter.remove();

while (iter.hasNext()){ 
     int next = iter.next(); 
     if (next % i == 0){ 
      iter.remove(); 
     } 
    } 

는 기본 컬렉션 반복자 (옵션)에 의해 반환 된 마지막 요소를 제거합니다. 이 메소드는 next를 호출 할 때마다 한 번만 호출 할 수 있습니다. 이 메서드를 호출하는 것 이외의 방법으로 반복 처리가 진행되고있는 동안에 기본 컬렉션이 수정되면 반복기의 동작은 지정되지 않습니다. ITERATOR

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); 
0

난 당신이 동시 변경 예외로 끝날한다고 생각합니다. 반복자를 사용하여 트리 집합을 반복하지만 동시에 트리 집합의 제거를 사용합니다. treeset에서 요소를 제거하려면 iter.remove()을 사용하십시오.

0

당신은 세트에 요소를 추가 한 후 반복자를 얻고, 해, 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);