2016-07-06 11 views
1

Ich möchte den Listen-Iterator zu einer bestimmten Position suchen, um einen von dort zu verschieben.So suchen Sie nach einem bestimmten Element in Liste Iterator

Ich habe geprüft, ob da irgendwas in den Sammlungen vorhanden ist aber ich konnte das nicht.

Unten ist die Implementierung, die ich versuchte, die funktioniert gut, aber ich würde gerne wissen, ob es eine bessere Möglichkeit, dies zu tun.

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

_ "aber ich konnte nicht" _ - warum nicht? Was ist passiert? Hast du eine Ausnahme bekommen? Wenn dies der Fall ist, posten Sie eine komplette Stapelverfolgung. –

+3

Ich sehe nicht, warum Sie eine 'fileList' als Instanzvariable brauchen, und ich sehe nicht, warum Sie wirklich Ihre' Klasse' brauchen - eine Hilfsmethode (wie Guava's ['Iterators.find'] (https : //google.github.io/guava/releases/16.0/api/docs/com/google/common/collect/Iterators.htm) wäre ausreichend Die Logik Ihrer Methode ist völlig verrückt - das Aufrufen der Methode setzt die '' zurück FileIterator' und sucht, anstatt weiterzumachen, und wenn nichts gefunden wird, wird es zufällig an den Anfang zurückgesetzt! –

+0

@Boris the Spider: Danke für die Utility-Methode.In Bezug auf das Zurücksetzen des Iterators - seinen Teil der Funktionalität, die ich versuche Die Methode Iterators.find funktioniert nicht Wenn ich nach dem n-ten Element suchen will, wenn ich den Iterator an der Position n + m habe – Praveen

Antwort

3

Es ist

  • List.indexOf
  • List.listIterator (int index)

sowohl auf die gewünschte Funktionalität kombinieren.

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

Während dies das unmittelbare Problem des OP (+1) löst, spricht es nicht die etwas wahnsinnige Logik an, diese Methode auf einem "Iterator" zu haben. Es bewirkt, dass der "Iterator" zurückgesetzt wird (anstatt von dort zu suchen, wo er gerade ist), und wenn nichts gefunden wird, kehrt er zum Start zurück. Dies ist nicht einmal im Entferntesten, wie eine vernünftige Person annehmen würde, dass "Iterator.seek" handelt. –

+0

@BoristheSpider man braucht Erfahrung, Ausprobieren. Einen Iterator von einer bestimmten Stelle in der Liste zu haben, erscheint nicht komisch, daher listIterator (index). Und ein ListIterator hat ein bisschen Positionierkraft. Die Verwendung eines internen Iterators ist in der Tat seltsam. Ein 'ListIteratorFrom (Liste Liste, T Daten)' würde mehr Sinn machen, aber ich vermute fast, dass die Liste auch sortiert ist. Eine Unterliste oder ein Stream? –

+0

@Joop Eggen: Danke. Es sieht besser aus als das, was ich versucht habe zu implementieren. :) – Praveen

Verwandte Themen