2011-05-06 8 views
3

그래서 두 개의 데이터 유형 (링크 된 목록 및 Arraylist)이 포함 된 프로그램을 만들고 있습니다.Java : 반복자

는 링크 된 목록 반복자는 다음과 같습니다

private class NodeIterator implements Iterator<StudentIF> { 
     private Node curr; 

     public NodeIterator(Node head) { 
      curr = head; 
     } 

     public void remove() { } 

     public boolean hasNext() { 
      if (curr == null) 
       return false; 
      return true; 
     } 

     public StudentIF next() { 
      Node temp = curr; 
      curr = curr.getNext(); 
      return temp.getData(); 
     } 

    } // end class NodeIterator 

내가 ArrayList의 반복자 방법/클래스를 호출합니다. 여기

MyArrayListName.iterator(); 

이 반복자 호출의 작업 수행하는 방법이다 : 나는 자신의 ID (인스턴스 변수)에 의해 내 개체를 가져 내 방법을 호출 할 때

public StudentIF getStudent(int id) { 
    Iterator<StudentIF> xy = iterator(); 
    while (xy.hasNext()) { 
     if (id == xy.next().getId()) { 
      return xy.next(); 
     } 
    } 
    // Student doesn't exist 
    return null; 
} 

내 문제를 항상 잡는다 NEXT 개체가 아니라 원하는 개체. 연결된 목록과 배열 목록을 모두 사용하여 현재 개체를 얻으려면 어떻게해야합니까?

도와주세요!

답변

4

문제를)하면 (다음 내용 전화하는거야 즉 두 번 루프에서 여기 :

if (id == xy.next().getId()) 
{ 
    return xy.next(); 
} 

next()를 두 번 호출하면 반복기가 두 번 진행되어 원하는 것과 다릅니다. 이 같은 임시 변수에 다음을 저장해야 문제를 방지 할 수 구문 :

StudentIF nextStudent = xy.next(); 
if (nextStudent.getId() == id) 
{ 
    return nextStudent; 
} 
+0

브라이언 감사합니다. 나는 진찰 때문에 당신의 대답을 받아 들였습니다. 좋은 발사! :-) 나는이 버그를 가지고있다. 당신의 도움을 주셔서 감사합니다! –

6

next() 방법을 두 번 사용합니다. 그 이유 일 수 있습니다.

if (id == xy.next().getId()) 

return xy.next(); 

실제로이 증가하고 호출하여 당신은 그래서는 반복자를 증가 다음() 메소드를 사용하여이

while (xy.hasNext()) { 
     StudentIF tmp = xy.next(); 
     if (id == tmp.getId()) { 
      return tmp; 
     } 
+2

당신은 또한에 대한 (XY StudentIF 학생)을 언급 할 수 있습니다. 좋은 대답. – ditkin

+1

@ditkin ... 그렇게 할 수 있도록 Iterable 인터페이스를 구현해서는 안됩니까? – insumity

3

매번 시도 반복자. 당신은 두 번 .next()를 호출

public StudentIF getStudent(int id) { 
Iterator<StudentIF> xy = iterator(); 
while (xy.hasNext()) { 
    StudentIF student = xy.next(); 
    if (id == student.getId()) { 
     return student; 
    } 
} 
// Student doesn't exist 
return null; 

}

2

:

가장 좋은 방법은() xy.next 저장 당신이 필요로하는 어떤 비교를 한 후 다음과 같이 반환하는 것입니다.

이 솔루션은 한 번만 호출하고이 같은 변수에 저장해야합니다

while (xy.hasNext()) { 
     StudentIF student = xy.next(); 
     if (id == student.getId()) { 
      return student; 
     } 
    }