2014-12-17 3 views
1

새로운 클래스의 for 루프를 사용하려고합니다. 까지 한 번호에서 인쇄 할 간단한 Java 프로그램을 만들었습니다. 다른 하나. 내가 루프 여기 의의 묘리를 터득 할 수없는 것은 내가 그것을 테스트하기 위해 만든 샘플 코드입니다 :for 루프를 사용하여 Java의 새 클래스를 반복합니다.

import java.util.Iterator; 
public class Try { 
    public static void main(String[] args) { 
     for (int i : new IntegerLoop(1, 9)) { 
     System.out.print(i + " "); 
     } 

     System.out.println(); 

     for (int i : new IntegerLoop(-3, 3)) { 
     System.out.print(i + " "); 
     } 

     System.out.println(); 

    } 
} 

이 바로 첫 번째와 마지막 숫자가 를 출력 처리하는 IntergerLoop 클래스입니다 import java.util.Iterator; 당신이 iterator 방법에서 null를 반환하기 때문에

public class IntegerLoop implements Iterable<Integer>, Iterator<Integer> { 
    int first, last; 
    int nextInt; 

    public IntegerLoop(int f, int l) { 
     first = f; 
     last = l; 
     nextInt = first; 
    } 

    public boolean hasNext() { 
     return nextInt >= first && nextInt <= last; 
    } 

    public Integer next() { 
     if (hasNext()) { 
      int result = nextInt; // needs Iterator 
      nextInt++; 
      return result; 
     } 
     return null; 
    } 

    @Override 
    public void remove() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public Iterator<Integer> iterator() { 
     // TODO Auto-generated method stub 
     return null; 
    } 
} 
+1

문제는 무엇인가? – Marv

+2

Iterables도 Iterators가 될 수 없다. iterator() 메서드는 매번 새로운 반복자를 반환해야합니다. –

+0

'new Class()가 코드와 관련이있는 것 (작동하지 않을 것)은 무엇입니까? – August

답변

2

당신은 iterator가 호출 될 때마다 새로운 인스턴스를 반환해야합니다 ...

@Override 
public Iterator<Integer> iterator() { 
    // TODO Auto-generated method stub 
    return null; 
} 

iterator 메소드를 NullPointerException을 받고 있습니다.

당신은 Iterator의 내부 클래스를 사용할 수 있지만이 예를 들어, 나는 ... 이것이 IntegerIterator 더 쉽게 재사용 (IMHO) 만들면서, 그것을 분리

IntegerLoop 클래스 ...

public class IntegerLoop implements Iterable<Integer> { 

    int first, last; 

    public IntegerLoop(int f, int l) { 
     first = f; 
     last = l; 
    } 

    @Override 
    public Iterator<Integer> iterator() { 
     return new IntegerIterator(first, last); 
    } 
} 

IntegerIterator 클래스 ...

public class IntegerIterator implements Iterator<Integer> { 

    int first, last; 
    int nextInt; 

    public IntegerIterator(int first, int last) { 
     this.first = first; 
     this.last = last; 
     this.nextInt = first; 
    } 

    @Override 
    public boolean hasNext() { 
     return nextInt >= first && nextInt <= last; 
    } 

    @Override 
    public Integer next() { 
     if (hasNext()) { 
      int result = nextInt; // needs Iterator 
      nextInt++; 
      return result; 
     } 
     return null; 
    } 

    @Override 
    public void remove() { 
     // TODO Auto-generated method stub 

    } 

} 
+0

굉장! 도와 주셔서 감사합니다! Iterator와 Iterable을 둘 다 구현하여 IntegerLoop을 사용할 수있는 방법이 있었습니까? 또는 java가 설계 상 이것을 허용하지 않았습니까? – Alex

+1

@Alex'iterator' 메쏘드는 호출 될 때마다'Iterator'의 새로운 인스턴스를 만들 필요가 있습니다. 기본적으로 프록시 역할을하게 될 것입니다. 악몽이 된 엉망이되어 – MadProgrammer

+0

다시 한번 감사드립니다. 매우 도움이된다. – Alex