2015-01-27 2 views
0

점프 반복자의 next() 및 hasNext()를 구현하면 생성자가 다른 반복자와 함께 전달됩니다. next() 함수는 iterator.next()를 반환합니다. next()점프 반복자를 구현하는 방법

아래 코드를 구현했지만 전혀 멋지지 않습니다. 리스트 {1, 9, 8, 7, 8, 2, 5}의 경우 9, 7, 2 만 출력됩니다. 더 좋은 방법으로 어떤 단서를 쓸 수 있습니까?

기본적으로이 점프 반복자는 1,2,3,4,5를 들어, 그것은 보인다 1,3,5

public class JumpIterator implements Iterator<Integer> { 
    private Iterator<Integer> it; 

    public JumpIterator(List<Integer> list){ 
     it = list.iterator(); 
    } 

    @Override 
    public boolean hasNext() { 
     if(!it.hasNext()){ 
      return false; 
     }else{ 
      it.next(); 
      return it.hasNext(); 
     } 
    } 

    @Override 
    public Integer next() { 
     return it.next(); 
    } 
} 
+0

JumpIterator''의 포인트는()'각'다음에 "하나를 생략하고 하나를 수행"하는 경우는, 당신의 결과는 지금 100 % 준수. 첫 번째 값을 건너 뛰지 않기를 바랍니다. –

답변

1

반환합니다, 예를 들어, 하나 개의 거리와 각 요소를 반복자하려고 저에게 당신의 문제는 'hasNext'함수에 있습니다.

왜 대체합니까? 어떤 행동을 원하십니까?

it.hasNext()가 true를 반환하면 it.next()를 사용하므로 소비하지 않아야하는 값을 소비합니다.

+0

네, 기본적으로이 점프 반복자는 하나의 거리를 가진 각 요소를 반복자로하려고합니다. 예를 들어, 1,2,3,4,5의 경우, 1,3,5를 반환합니다. 그래서 첫 번째 위치에서 hastNext()는 세 번째 위치에 요소가 있는지 확인해야합니다. 실제로 next()를 호출하지 않고 hasNext()에서 두 번째 위치로 진행하려면 어떻게 구현해야합니까? – zdlgrj

0

이러한 메서드 구현은 현재 프로그램이 항상 hasNextnext에 대한 호출을 인터 레이싱한다고 가정하고 있으며, 이로 인해 장기간에 일부 문제가 발생할 수 있습니다.

JumpIterator jit = ...; 
jit.hasNext(); 
jit.haxNext(); // skipped a relevant value 
jit.next(); 
jit.next(); // obtained two adjacent values 

다음은 문제를 해결하는 방법입니다. 즉, 다음 값이 이미 확인되었는지 여부를 추적합니다.이 경우 이미 하나의 값을 건너 뜁니다. 의도 된 목표는 "한 번 건너 뛰고 다음 걸릴"요소가 검색 될 때마다하는 경우보다 다른

public class JumpIterator implements Iterator<Integer> { 
    private Iterator<Integer> it; 
    private boolean skipped; 

    public JumpIterator(List<Integer> list){ 
     it = list.iterator(); 
     skipped = false; 
     // if you want to take the first value from the stream, 
     // change skipped to true 
    } 

    @Override 
    public boolean hasNext() { 
     if (it.hasNext() && !skipped) { 
      it.next(); 
      skipped = true; 
     } 
     return it.hasNext(); 
    } 

    @Override 
    public Integer next() { 
     if (!skipped) { 
      it.next(); 
     } 
     skipped = false; 
     return it.next(); 
    } 
} 

는 점프 반복자 작동합니다. 이 논리에서 시퀀스 [1,2,3,4]의 반복기를 사용하면 [2,4]이 표시됩니다. [1,3] 대신에 (첫 번째 값을 건너 뛰지 않고) 위에서 설명한대로 구현을 조정하면됩니다.

0

나는 뭔가

public class JumpIterator implements Iterator<Integer> { 
    private Iterator<Integer> it; 

    public JumpIterator(List<Integer> list){ 
    this.it = list.iterator(); 
    } 

    @Override 
    public boolean hasNext() { 
    //hasNext should be idempotent (should not modify the state) 
    return it.hasNext(); 
    } 

    @Override 
    public Integer next() { 
    //If the user didn't check hasNext() 
    // NoSuchElementException might be thrown, 
    // which is interface-compliant, so we just don't care 
    Integer nNext = it.next(); 

    //Now we must skip the next value 
    if (it.hasNext()) it.next(); 
    return nNext; 
    } 
} 

이것은 하지이 첫 번째 요소를 건너 뜁니다처럼 만들 것입니다. 그렇게하고 싶다면, E_net4에 의해 설명 된 lazy skipping 정책이 필요하다. 난 그냥 그것을 고려 거라고 :

public class JumpIterator implements Iterator<Integer> { 
    private Iterator<Integer> it; 
    private boolean bMustSkip; 

    public JumpIterator(List<Integer> list){ 
    this.it = list.iterator(); 
    this.bMustSkip = true; 
    } 

    private Iterator<Integer> myIterator() { 
    if (bMustSkip && it.hasNext()) { 
     it.next(); //Skipped 
    } 
    bMustSkip = false; 
    return it; 
    } 

    @Override 
    public boolean hasNext() { 
    //hasNext should be idempotent (should not modify the state) 
    return myIterator().hasNext(); 
    } 

    @Override 
    public Integer next() { 
    //If the user didn't check hasNext() 
    // NoSuchElementException might be thrown, 
    // which is interface-compliant, so we just don't care 
    Integer nNext = myIterator().next(); 
    bMustSkip = true; 
    return nNext; 
    } 
} 
+0

당신의 솔루션에서 hasNext()는 실제로 예상 한 결과를 반환하지 않습니다. 예를 들어 list {1, 2}가 있는데, 첫 번째 위치에 있고 hasNext()를 호출하면 true를 반환하지만 건너 뛰기 논리에 따라 다음 요소가 없습니다. – zdlgrj

+0

@zdlgrj 첫 번째 해법에서'hasNext()'는 처음에'true'를 반환 할 것이고 (왜냐하면 1은 다음 요소이기 때문에'next'가 호출 된 후'it'가 'next()'. –

+0

@zdlgrj 두 번째 솔루션에서'hasNext()'는 firs에서'true'를 반환 할 것입니다. 왜냐하면'myIterator()'는 처음 호출 될 때'it'를 진행할 것이기 때문입니다. 'next()'가 호출 되 자마자 2가 반환되고 'it'이 끝으로 이동합니다. '! it.hasNext()'와'hasNext()'는 false를 반환하기 때문에'myIterator()'는 아무것도하지 않을 것입니다. –

0
public class JumpIterator implements Iterator<Integer> { 
    Iterator<Integer> iterator; 

public JumpIterator(Iterator<Integer> iterator) { 
    // TODO Auto-generated constructor stub 
    this.iterator = iterator; 
} 

@Override 
public boolean hasNext() { 
    // TODO Auto-generated method stub 
    return iterator.hasNext(); 
} 

@Override 
public Integer next() { 
    // TODO Auto-generated method stub 
    int res = iterator.next(); 
    if (iterator.hasNext()) { 
     iterator.next(); 
    } 
    return res; 
} 

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

} 

}

관련 문제