package jqian.util; import java.util.*; /** * @author bruteforce * A compact set representation. Currently this set is read only. */ public class SortedArraySet<E> extends AbstractSet<E> { private static final int DEFAULT_SIZE = 8; private Object[] _elements; private Comparator<Object> _comparator; @SuppressWarnings("unchecked") public SortedArraySet(Collection<E> numberables,Comparator<E> comparator) { _elements = numberables.toArray(); _comparator = (Comparator<Object>)comparator; Arrays.sort(_elements,_comparator); } @SuppressWarnings("unchecked") public SortedArraySet(int size, Comparator<E> comparator){ _elements = new Object[size]; _comparator = (Comparator<Object>)comparator; } public SortedArraySet(Comparator<E> comparator){ this(DEFAULT_SIZE,comparator); } public boolean isEmpty() { return _elements.length == 0; } public boolean contains(Object o) { int id = Arrays.binarySearch(_elements, o,_comparator); return id >= 0; } public boolean containsAll(Collection<?> c) { for (Iterator<?> it = c.iterator(); it.hasNext();) { Object o = it.next(); if (!contains(o)) { return false; } } return true; } public int size() { return _elements.length; } public Object[] toArray() { Object[] array = new Object[_elements.length]; System.arraycopy(_elements, 0, array, 0, _elements.length); return array; } public boolean equals(Object o) { if (o.getClass() != this.getClass()) return false; SortedArraySet<?> that = (SortedArraySet<?>) o; if (that._elements.length != this._elements.length) return false; int length = _elements.length; for (int i = 0; i < length; i++) { if (!this._elements[i].equals(that._elements[i])) return false; } return true; } private class ArrayIterator implements Iterator<E> { public boolean hasNext() { return _index < _elements.length; } @SuppressWarnings("unchecked") public E next() { if(_index >= _elements.length) throw new NoSuchElementException(); E o = (E)_elements[_index]; _index++; return o; } public void remove() { throw new RuntimeException("Not implemented"); } int _index; } public Iterator<E> iterator() { return new ArrayIterator(); } public String toString(){ StringBuffer buf = new StringBuffer(); buf.append('['); int size = _elements.length; for(int i=0;i<size;i++){ Object elmt = _elements[i]; buf.append(elmt.toString()); if(i<size-1){ buf.append(", "); } } buf.append(']'); return buf.toString(); } public void clear() { for(int i=0; i<_elements.length; i++){ _elements[i] = null; } } public boolean remove(Object o) { throw new RuntimeException("Method not implemented"); } public boolean add(E e){ throw new RuntimeException("Do not support element by element add, this would be slow"); } protected void doubleCapacity(){ int newSize = _elements.length * 2; Object[] newElements = new Object[newSize]; System.arraycopy(_elements, 0, newElements, 0, _elements.length); _elements = newElements; } }