2016-07-06 3 views
1

목록 반복기를 특정 위치로 이동하여 목록 반복기를 이동하려고합니다.목록 반복기에서 특정 항목을 찾는 방법

내가 체크했는데 컬렉션에 사용 가능한 것이 있으면 그럴 수 없었다.

다음은 올바르게 작동하는 구현입니다.하지만이를 수행하는 데 더 좋은 방법이 있는지 알고 싶습니다.

class FileIterator implements ListIterator<String>{ 

     ListIterator<String> iterator = null; 
     List<String> fileList; 

     public FileIterator(List<String> fileList) { 
      this.fileList=fileList; 
      iterator=fileList.listIterator(); 
     } 

     @Override 
     public void add(String data) { 
      iterator.add(data);   
     } 

     @Override 
     public boolean hasNext() { 
      return iterator.hasNext(); 
     } 

     @Override 
     public boolean hasPrevious() { 
      return iterator.hasPrevious(); 
     } 

     @Override 
     public String next() { 
      return iterator.next(); 
     } 

     @Override 
     public int nextIndex() { 
      return iterator.nextIndex(); 
     } 

     @Override 
     public String previous() { 
      return iterator.previous(); 
     } 

     @Override 
     public int previousIndex() { 
      return iterator.previousIndex(); 
     } 

     @Override 
     public void remove() { 
      iterator.remove(); 
     } 

     @Override 
     public void set(String data) { 
      iterator.set(data); 
     } 

     public boolean seek(String data){ 
      iterator=fileList.listIterator(); 
      while(iterator.hasNext()){ 
       if(iterator.next().equals(data)) 
        return true; 
      } 
      //gives the first element by default 
      iterator=fileList.listIterator(); 
      return false; 
     } 

    } 
+0

_ "하지만 _"할 수 없었습니다. 어떻게 된 거예요? 예외가 있니? 그렇다면 완전한 스택 추적을 게시하십시오. –

+3

왜 인스턴스 변수로'fileList'가 필요한지 알지 못합니다. 실제로'class'가 필요한 이유는 모르겠습니다 - 유틸리티 메소드 (Guava의 ['Iterators.find'] (https : //google.github.io/guava/releases/16.0/api/docs/com/google/common/collect/Iterators.htm) 메소드의 논리가 완전히 제정신이 아니므로 메소드를 호출하면 ' FileIterator'와 계속되는 것보다 검색하고 아무 것도 발견되지 않으면 무작위로 시작으로 다시 설정합니다! –

+0

@ Boris the Spider : 유틸리티 메소드를 사용해 주셔서 감사합니다. 반복기를 재설정하는 것과 관련하여 - 내가하려는 기능 중 일부 달성했다. 또한 Iterators.find 메서드가 작동하지 않습니다. n + m 위치에 반복기가있을 때 일부 n 번째 요소를 찾으려고합니다. – Praveen

답변

3

  • List.listIterator (INT 지수)
  • 모두가 원하는 기능에 결합 할 수 있습니다 List.indexOf

    • 있습니다.

      public boolean seek(String data){ 
           int index = fileList.indexOf(data); 
           iterator = fileList.listIterator(index == -1 ? 0 : index); 
           return index != -1; 
          } 
      
    +1

    이것이 OP의 즉각적인 문제 (+1)를 해결하는 반면, Iterator에서이 방법을 사용하는 다소 정신없는 논리는 다루지 않습니다. 그것은'Iterator'가 (현재 위치에서 검색을 시작하기보다는) 재설정되도록합니다. 아무것도 발견되지 않으면 시작으로 돌아갑니다. 이것은 합리적인 사람이 'Iterator.seek'라고 생각하는 방식을 원격으로조차하지 않습니다. –

    +0

    @BoristheSpider 사람은 경험을 필요로합니다. 목록의 특정 위치에서 반복자를 갖는 것이 이상하게 보이지 않으므로 listIterator (index). 그리고 ListIterator에는 약간의 위치 지정 기능이 있습니다. 내부적으로 새로운 Iterator를 만드는 사용법은 실제로 이상합니다. 'ListIteratorFrom (List list, T data)'는 더 많은 의미를 갖겠지 만, 나는 목록이 너무 정렬되어 있다고 의심한다. 하위 목록 또는 스트림? –

    +0

    @Joop Eggen : 감사합니다. 구현을 시도한 것보다 더 좋아 보인다. :) – Praveen

    관련 문제