2016-07-06 2 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' вообще - метод полезности (например, '' Iterators.find'' Guava (https : //google.github.io/guava/releases/16.0/api/docs/com/google/common/collect/Iterators.htm). Логика вашего метода совершенно безумна - вызов метода сбрасывает ' FileIterator' и ищет, а не продолжать, и если ничего не найдено, он случайно сбрасывает его до начала! –

+0

@Boris the Spider: Спасибо за утилиту. В отношении с сбросом итератора - его часть функциональности, которую я пытаюсь Кроме того, метод Iterators.find не работает. Если я хочу поискать некоторый n-й элемент, когда у меня есть итератор в позиции n + m. – Praveen

ответ

3

Существует

  • List.indexOf
  • List.listIterator (INT индекс)

Оба они могут сочетать до желаемой функциональности.

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

Хотя это и устраняет непосредственную проблему OP (+1), она не затрагивает несколько безумную логику использования этого метода на «Итераторе». Это заставляет «Итератор» сбросить (а не начать поиск с того места, где он сейчас), и если ничего не найдено, оно возвращается к началу. Это даже не отдаленно, как любой разумный человек будет принимать действия «Итератор». –

+0

@BoristheSpider нужен опыт, пытаясь разобраться. Наличие итератора из определенного места в списке не кажется странным, поэтому listIterator (index). И ListIterator имеет немного позиционирования. Использование, создающее новый Iterator внутри, действительно странно. «ListIteratorFrom (List list, T data)» будет иметь больший смысл, но я почти подозреваю, что список также будет отсортирован. Подписок или поток? –

+0

@Joop Eggen: Спасибо. Он выглядит лучше, чем я пытался реализовать. :) – Praveen

Смежные вопросы