Mega Code Archive

 
Categories / Java / Collections Data Structure
 

Array Set

/* 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             }         }     } }