2013-03-08 5 views
2

알 수없는 유형 T가있는 반복 가능한 객체 유형을 취하는 메소드가 있는데,이 메소드를 통해 항목을 가져 와서 다른 데이터 구조에 넣습니다. 정렬 된 순서로 항목을 다시 추가 할 수 있도록 이전 iterable 개체에서 각 항목을 삭제해야합니다.반복 가능한 객체를 체계적으로 비워서 반복 할 수 있습니까?

루프 후 오브젝트에 .clear()을 사용하려고 시도했지만 명확한 방법이 보장되지 않습니다. 그렇다면 항목을 삭제할 때 어떻게 삭제할 수 있습니까? 아니면 정확한 유형은 있지만 값이없는 새 개체를 만들면 모든 것을 다시 추가 할 수 있습니다. 객체가 Iterable이라는 것을 알면 어떻게됩니까?

public class PriorityQueue<K extends Comparable<? super K>,V> { 

    public static <K> void PriorityQueueSort(Iterable<? extends K> list, 
     PriorityQueue<? super K, ?> queue) { 

     for (K item : list) { 
      queue.insert(item, null); 
     } 

     list.clear(); 
    } 
} 
+1

'remove()'의 예를 보려면 여기를보십시오. http://stackoverflow.com/questions/1196586/calling-remove-in-foreach-loop-in-java –

답변

3

대신에 대한-각 루프, 명시 적 Iterator 객체와 Iterator.remove() 사용하십시오 사용하는 :하지 모든 Iterator 구현 (예를 들어 개체 제거를 지원 염두에

Iterator<K> iter = list.iterator(); 
    while (iter.hasNext()) { 
     K item = iter.next(); 
     queue.insert(item, null); 
     iter.remove(); 
    } 

곰을 읽기 전용 컬렉션을 습관).

1

목록을 살펴 보려면 Iterator을 사용해야합니다. 이터레이터는 remove 메소드를 지원합니다.

1

모든 컬렉션은 반복 가능하지만 반대는 사실이 아닙니다. 따라서 반복자 항목을 생성하는 데이터 소스에서 무언가를 제거하는 것이 항상 의미가 있다고 기대할 수는 없습니다. 이 꽤 복잡한 hello world 예제에서와 같이 :

Iterable<Character> myIterable = new Iterable<Character>() { 

    @Override 
    public Iterator<Character> iterator() { 
     Iterator<Character> it = new Iterator<Character>() { 

      private String hello = "Hello World"; 
      private int counter = 0; 

      @Override 
      public boolean hasNext() { 
       return counter < hello.length(); 
      } 

      @Override 
      public Character next() { 
       return hello.charAt(counter++); 
      } 

      @Override 
      public void remove() { 
       throw new UnsupportedOperationException(); 
      } 

     }; 
     return it; 
    } 
}; 

for (Character c : myIterable) { 
    System.out.print(c); 
} 

반복 가능한 컬렉션이 없습니다. 그것은 단지 "반복 제공자"이며 문자열조차도 포함합니다 (그리고 문자열에서 문자를 제거 할 수없고 문자열은 변경 불가능합니다).

아니요, 반복 할 수 없으며 모든 반복기가 항목 제거를 지원하지는 않습니다.

관련 문제