2013-04-14 1 views
1

마지막 부분을 제외한 ArrayList의 모든 요소를 ​​반복해야합니다. 그래서 그러한 반복자를 만들고 싶습니다. 하지만 전체 이터레이터를 구현하는 것이 아니라, hasNext() 메서드 만 재정의해야하므로 "표준"반복기를 하위 클래스로 만들고 싶습니다. 그것을 할 방법이 있습니까?"표준"arraylist 반복자를 서브 클래스화할 수 있습니까?

답변

1

이 순회를 수행하기 위해 반복자를 수정하는 것이 이상합니다. (. 아니면 RandomAccess 목록을 가정 인덱스를 사용)

public static <T> void eachExceptLast(List<? extends T> list, Operation<T> op) { 
    Iterator<T> iter = list.iterator(); 
    if (!iter.hasNext()) { 
     return; 
    } 
    T item = iter.next(); 
    while (iter.hasNext()) { 
     op.run(item); 
     item = iter.next(); 
    } 
} 

그러나,이 일을 더 나은 방법이있다 : 할 분명한 것은 당신이 그것을 원하는대로 "알고리즘"을 작성하는 것입니다. list.subList(0, list.size()-1) (비어 있지 않은 목록의 경우)는 마지막 요소보다 적은 원본 목록의보기를 반환합니다. 복사를하지 않으며 Iterator.remove을 사용할 수도 있습니다.

3

기본 반복기를 재정의하는 대신 더 나은 방법은 ArrayList을 직접 반복하는 것입니다. ArrayList에는 작업을 수행하는 데 도움이되는 몇 가지 방법이 정의되어 있습니다 (get(int)size()).
ArrayList (size())에있는 요소의 총 개수를 가져온 다음 get() 메서드를 사용하여 각 반복에서 각 요소에 직접 액세스하는 요소를 반복하면됩니다. 코드는 다음과 같을 것이다 :

for(int i = 0; i < myList.size() - 1; i++){ 
     element = myList.get(i); 
     //do something 
    } 

지금 마음에서이 원칙, 당신은 ArrayList을 반복하는 자신의 클래스를 만들 수 있습니다.

+0

+1 훨씬 쉽습니다. –

관련 문제