web-dev-qa-db-ja.com

カスタムクラスで各ループにJavaを使用するにはどうすればよいですか?

ほとんどのコーダーは次のようなコードを使用していると思います。


ArrayList<String> myStringList = getStringList();
for(String str : myStringList)
{
   doSomethingWith(str);
}

自分のクラスでfor eachループを活用するにはどうすればよいですか?実装すべきインターフェイスはありますか?

46
Geo

Iterable を実装できます。

です。オブジェクトはそれ自体のイテレータなので、最適ではありません。しかし、それはあなたに何が起こっているかについてのアイデアを与える必要があります。

52
Brian Agnew

Forループの短いバージョン(Tは私のカスタム型を表します):

for (T var : coll) {
    //body of the loop
}

に翻訳されます:

for (Iterator<T> iter = coll.iterator(); iter.hasNext(); ) {
    T var = iter.next();
    //body of the loop
}

私のコレクションのイテレータは次のようになります。

class MyCollection<T> implements Iterable<T> {

    public int size() { /*... */ }

    public T get(int i) { /*... */ }

    public Iterator<T> iterator() {
        return new MyIterator();
    }

    class MyIterator implements Iterator<T> {

        private int index = 0;

        public boolean hasNext() {
            return index < size();
        }

        public type next() {
            return get(index++);
        }

        public void remove() {
            throw new UnsupportedOperationException("not supported yet");

        }
   }
}
11
Tombart

Iterable interface を実装する必要があります。つまり、メソッドを実装する必要があります

class MyClass implements Iterable<YourType>
{
Iterator<YourType> iterator()
  {
  return ...;//an iterator over your data
  }
}
7
Pierre