2011-08-07 2 views
1

종종 ArrayList<>을 설정할 필요가 있습니다. 생성자 중 하나가 컬렉션을 취하지 만 반복자를 사용하는 생성자가 없습니다.자바에서 반복자 컬렉션을 얻는 방법은 무엇입니까?

반복기가 있으면 어떻게됩니까? ArrayList<> 생성자를 사용하기 위해 이터레이터를 제공하는 컬렉션에 "도달"할 수있는 방법이 있습니까?
PropertiesConfiguration.getKeys()에 의해 제공되는 반복기는 특히 org.apache.commons의 일부입니다.

답변

11

IteratorCollection과 같은 것이 없습니다. 반복기는 Collection과 독립적으로 생성 될 수 있습니다. 어떤 Iterable에서 얻을 수도 있고, 반복자를 구현하는 클래스를 만들 수도 있습니다. 가 이후이 가능한 모든 반복자에 대해 안정적으로 수행 할 수 없습니다, 그러나,

Iterator<X> it = ...; 
List<X> list = new ArrayList<X>(); 
while (it.hasNext()) { 
    list.add(it.next()); 
} 

참고 :

그러나, 당신은 그것을 반복하고 하나의 요소를 추가하여 Iterator에서 ArrayList를 얻을 수 있습니다 반복자가 영속적으로 반복 할 가능성이 있으므로 무한 루프가 발생하고 대부분은 OutOfMemoryError이됩니다.

Google의 유틸리티 라이브러리 Google Guava을 살펴 보시기 바랍니다.

Iterator<X> it = ...; 
List<X> list = Lists.newArrayList(it); 

도서관은 일상 자바 코딩을위한 매우 유용한 방법의 톤이있다 : 그것은 당신이 다음을 수행 할 수 있도록리스트라는 클래스가 있습니다. 그것은 대부분 당신이 원하지만 표준 Java 6 API에서 찾을 수없는 모든 것을 담고 있습니다. next, hasNextremove : 자바, Iterator은 세 가지 방법으로 단지 인터페이스이기 때문에

1

는이 작업을 수행 할 진정으로 일반 방법은 없습니다.

반복자를 얻으면 인터페이스를 구현하는 일부 클래스의 인스턴스를 제공하는 팩터 리 메서드를 사용합니다. 특정 클래스를 알고 있으면 해당 문서 나 소스를보고 반복되는 컬렉션을 찾는 방법이 있는지 찾을 수 있습니다.

하지만 많은 클래스가 있습니다. ArrayList의 경우, 소스 코드에서 어떤 종류의 반복자가 있는지 확인하십시오.

EDIT 일 : ArrayList 위에 http://www.docjar.com/html/api/java/util/ArrayList.java.html

반복자는 개인Itr 내부 클래스의 인스턴스이다 : 여기

오픈 JDK 7 ArrayList 소스 코드이다. 이것은 너무 놀라운 것이 아닙니다. 어쨌든 반복자는 팩터 리 메소드에서 가져온 것이므로 실제로 어떤 종류의 반복자가 있는지 알지 못한다. 사실 인 경우이 인스턴스의 클래스를 가져 와서 해당 메소드에 액세스 할 수 있습니다 (예 : 리플렉션을 통해). 나쁜 일을하는 것입니다. 이 반복자는 ArrayList 클래스의 (내부) 구현의 일부이며 (@merryprankster가 지적한대로) 향후 변경 될 수 있습니다.

+1

다시 '호환성'이 유지된다는 보장이 없으므로 다시'ArrayList' 구현의 내부 세부 사항에 의존해서는 안됩니다. Apache Commons Collections, 특히 IteratorUtils를 참조하십시오. Iterator를 배열이나리스트로 변환하는 데 도움이되는 몇 가지 헬퍼를 제공합니다. – merryprankster

+0

오, 확실히 좋은 지적입니다. iterator 인터페이스가 제한되고 팩토리에서 반환 된 실제 객체가 private 클래스의 인스턴스 인 이유가 있습니다 (구현이 미래에 변경 될 수 있으므로). 이 일은 만져서는 안되며 그렇습니다. –

+0

@Ray Total : Iterator를 생성하는 우물 디자인 클래스는 java.lang.reflect의 검은 마법을 사용하지 않고 내부 데이터 구조에 액세스 할 수 없도록합니다. –

0

가능한지는 모르겠지만 제 견해로는 반복기가 컬렉션에서 나오지 않을 수 있으므로 그러한 함수가 없어야합니다. 예를 들어, 여러 컬렉션을 묶는 반복자를 만들 수 있습니다!

관련 문제