2016-07-06 7 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には少しの位置決め力があります。内部的に新しいイテレータを作成する使用法は実際には奇妙です。 'ListIteratorFrom(List list、T data)'はもっと意味がありますが、リストのソートもほとんど疑わしいです。サブリスト、またはストリーム? –

    +0

    @Joop Eggen:ありがとう。それは私が実装しようとしたものよりよく見えます。 :) – Praveen

    関連する問題