Java tutorial
/* Copyright (c) 2006, 2009, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ import java.util.AbstractSet; import java.util.ConcurrentModificationException; import java.util.Iterator; import java.util.NoSuchElementException; public class ArraySet extends AbstractSet { private static final Object[] EMPTY_ARRAY = new Object[0]; private class ArrayIterator implements Iterator { int itVersion = version; int pos = 0; // position of next item to return boolean hasNext = values.length > 0; boolean removeOk = false; public boolean hasNext() { return hasNext; } public Object next() { if (itVersion != version) { throw new ConcurrentModificationException(); } else if (!hasNext) { throw new NoSuchElementException(); } else { Object ret = values[pos]; ++pos; hasNext = pos < values.length; removeOk = true; return ret; } } public void remove() { if (itVersion != version) { throw new ConcurrentModificationException(); } else if (!removeOk) { throw new IllegalStateException(); } else if (values.length == 1) { values = EMPTY_ARRAY; ++version; itVersion = version; removeOk = false; } else { Object[] newValues = new Object[values.length - 1]; if (pos > 1) { System.arraycopy(values, 0, newValues, 0, pos - 1); } if (pos < values.length) { System.arraycopy(values, pos, newValues, pos - 1, values.length - pos); } values = newValues; --pos; ++version; itVersion = version; removeOk = false; } } } private int version = 0; private Object[] values = EMPTY_ARRAY; public ArraySet() { } public Object[] toArray() { return values; } public Object clone() { ArraySet ret = new ArraySet(); if (this.values == EMPTY_ARRAY) { ret.values = EMPTY_ARRAY; } else { ret.values = (Object[]) this.values.clone(); } return ret; } public void clear() { values = EMPTY_ARRAY; ++version; } public boolean isEmpty() { return values.length == 0; } public int size() { return values.length; } public boolean add(Object value) { int n = values.length; for (int i = 0; i < n; i++) { if (values[i].equals(value)) return false; } Object[] newValues = new Object[n + 1]; System.arraycopy(values, 0, newValues, 0, n); newValues[n] = value; values = newValues; ++version; return true; } public boolean contains(Object value) { for (int i = 0, n = values.length; i < n; i++) { if (values[i].equals(value)) return true; } return false; } public Iterator iterator() { return new ArrayIterator(); } public static void main(String[] args) throws java.io.IOException { ArraySet set = new ArraySet(); java.io.BufferedReader in = new java.io.BufferedReader(new java.io.InputStreamReader(System.in)); while (true) { System.out.print(set.size() + ":"); //OK for (Iterator it = set.iterator(); it.hasNext();) { System.out.print(" " + it.next()); //OK } System.out.println(); //OK System.out.print("> "); //OK String cmd = in.readLine(); if (cmd == null) break; cmd = cmd.trim(); if (cmd.equals("")) { ; } else if (cmd.startsWith("+")) { set.add(cmd.substring(1)); } else if (cmd.startsWith("-")) { set.remove(cmd.substring(1)); } else if (cmd.startsWith("?")) { boolean ret = set.contains(cmd.substring(1)); System.out.println(" " + ret); //OK } else { System.out.println("unrecognized command"); //OK } } } }