For now, I thought that it would be handy to know which iterators support remove() and which don’t.
package iterators.remove_supported;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Stack;
import java.util.TreeSet;
import java.util.Vector;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ConcurrentSkipListSet;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.PriorityBlockingQueue;
/**
 * Test class designed to figure out which iterators support the optional remove() method and
 * which don't.
 * 
 * @author Roger
 * 
 */
public class IteratorRemoveSupported {
  private static Collection<Collection<String>> testCollections;
  static {
    testCollections = new ArrayList<Collection<String>>();
    testCollections.add(new ArrayList<String>());
    testCollections.add(new LinkedList<String>());
    testCollections.add(new Vector<String>());
    testCollections.add(new Stack<String>());
    testCollections.add(new CopyOnWriteArrayList<String>());
    testCollections.add(new TreeSet<String>());
    testCollections.add(new LinkedHashSet<String>());
    testCollections.add(new HashSet<String>());
    testCollections.add(new CopyOnWriteArraySet<String>());
    testCollections.add(new ConcurrentSkipListSet<String>());
    testCollections.add(new ArrayBlockingQueue<String>(3));
    testCollections.add(new ArrayDeque<String>());
    testCollections.add(new ConcurrentLinkedQueue<String>());
    testCollections.add(new HashSet<String>());
    testCollections.add(new LinkedBlockingDeque<String>());
    testCollections.add(new LinkedBlockingDeque<String>());
    testCollections.add(new LinkedBlockingQueue<String>());
    testCollections.add(new PriorityBlockingQueue<String>());
    testCollections.add(new PriorityQueue<String>());
  }
  /**
   * Run the test, picking each
   * 
   * @param args
   */
  public static void main(String[] args) {
    System.out.println("Iterator remove() method Test Program.\n");
    for (Collection<String> collection : testCollections) {
      collection.add("Test String");
      testACollection(collection);
    }
    System.out.println("\nIterator Test Program - End");
  }
  private static void testACollection(Collection<String> collection) {
    System.out.print(collection.getClass().getSimpleName());
    Iterator<String> it = collection.iterator();
    try {
      if (it.hasNext()) {
        it.next(); // This has to be called BEFORE you can call remove()
        it.remove(); // If not, you get an IllegalStateException
        System.out.println(" - Supported");
      } else {
        System.out.println(" - Collection empty - Error");
      }
    } catch (Exception e) {
      System.out.println(" - Unsupported");
    }
  }
}ArrayList - Supported
LinkedList - Supported
Vector - Supported
Stack - Supported
CopyOnWriteArrayList - Unsupported
TreeSet - Supported
LinkedHashSet - Supported
HashSet - Supported
CopyOnWriteArraySet - Unsupported
ConcurrentSkipListSet - Supported
ArrayBlockingQueue - Supported
ArrayDeque - Supported
ConcurrentLinkedQueue - Supported
HashSet - Supported
LinkedBlockingDeque - Supported
LinkedBlockingDeque - Supported
LinkedBlockingQueue - Supported
PriorityBlockingQueue - Supported
PriorityQueue - Supported
From these results you can see that most Iterator support remove, with the exception of CopyOnWriteArrayList and CopyOnWriteArraySet.
No comments:
Post a comment