2011-12-07 7 views
7

Iteratorオブジェクトから特定の要素をフィルタリングしようとしていましたが、iterator.remove()メソッドでfalse要素を削除できます。ここで java.util.Iterator.remove()メソッドが 'optional operation'のときはどういう意味ですか?

は私のメソッドスタブです:私は非関連の要素を削除することができます

private static Iterator<A> process(Iterator<A> iter, Per p) { 
     while(iter.hasNext()){ 
      A o = iter.next(); 
      if(p.per(o)){ 
      iter.remove(); 
      } 
     } 
     return iter; 
    } 

、私はIterator.reomve()用のJava APIに見たとき、それは言っている:

void remove(): イテレータによって返された最後の要素を基になるコレクションから削除します(オプション操作)。このメソッドは、1回の呼び出しで1回だけ呼び出すことができます。このメソッドを呼び出す以外の方法で繰り返し処理が進行しているときに、基礎となるコレクションが変更された場合、反復子の動作は不明です。

なぜオプション操作なのか混乱しましたか? remove()メソッドを使用するときにプログラマがより注意するようにする警告ですか?それとも他の意味ですか?

ご協力いただきありがとうございます。

そして、私はコンパイルされたコード全体は、あなたの参考のために以下の通りです:

package com.test.iterator; 

import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 

public class IteratorTest { 

    public static void main(String[] args) { 
     final IteratorTest it = new IteratorTest(); 

     List<A> list = new ArrayList<A>(){{ 
      add(it.new A(10)); 
      add(it.new A(11)); 
      add(it.new A(12)); 
      add(it.new A(13)); 
      add(it.new A(16)); 
     }}; 

     Iterator<A> iter = list.iterator(); 
     iter = process(iter, it.new Per()); 
     System.out.println(""); 
    } 

    private static Iterator<A> process(Iterator<A> iter, Per p) { 
     while(iter.hasNext()){ 
      A o = iter.next(); 
      if(p.per(o)){ 
       iter.remove(); 
      } 
     } 
     return iter; 
    } 

    class A{ 
     private String name; 
     private int age; 
     public A(int i){ 
      this.age = i; 
      this.name = i + ",wang"; 
     } 
    } 
    class Per{ 
     public boolean per(A a){ 
      if(a.age % 2 == 0){ 
       return true; 
      }else{ 
       return false; 
      } 
     } 
    } 

} 

答えて

15

それはAPIの契約につき、remove()方法は、すべての実装に/利用可能に実装する必要がないことを意味します。これは、いくつかの実装では、単に意味をなさないかもしれないし、実装するのが実行不可能であるかもしれないからです。良い例は、Collections.unmodifiableCollection()によって返されたものなど、読み取り専用のコレクションで返されるイテレータです。

+0

+1良い例です。 –

+1

良い例で良い説明。 +1。 –

+0

+1非常に明確で教育的です。 –

2

これは、Iteratorの実装ではオプションであることを意味します。実装によっては、それをサポートする機能を提供するものもあれば、UnsupportedOperationExceptionを投げるものもあります。あなたのケースでは、その操作をサポートするIteratorを使用しているので、問題ありません。

関連する問題