123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416 |
- package com.sinosoft.cm.common;
- import java.util.Arrays;
- import java.util.Collection;
- import java.util.Iterator;
- public abstract class AbstractCollection<E> implements Collection<E> {
- /**
- * Sole constructor. (For invocation by subclass constructors, typically
- * implicit.)
- */
- protected AbstractCollection() {
- }
- // Query Operations
- /**
- * Returns an iterator over the elements contained in this collection.
- *
- * @return an iterator over the elements contained in this collection
- */
- public abstract Iterator<E> iterator();
- public abstract int size();
- /**
- * {@inheritDoc}
- *
- * <p>This implementation returns <tt>size() == 0</tt>.
- */
- public boolean isEmpty() {
- return size() == 0;
- }
- /**
- * {@inheritDoc}
- *
- * <p>This implementation iterates over the elements in the collection,
- * checking each element in turn for equality with the specified element.
- *
- * @throws ClassCastException {@inheritDoc}
- * @throws NullPointerException {@inheritDoc}
- */
- public boolean contains(Object o) {
- Iterator<E> it = iterator();
- if (o==null) {
- while (it.hasNext())
- if (it.next()==null)
- return true;
- } else {
- while (it.hasNext())
- if (o.equals(it.next()))
- return true;
- }
- return false;
- }
- /**
- * {@inheritDoc}
- *
- * <p>This implementation returns an array containing all the elements
- * returned by this collection's iterator, in the same order, stored in
- * consecutive elements of the array, starting with index {@code 0}.
- * The length of the returned array is equal to the number of elements
- * returned by the iterator, even if the size of this collection changes
- * during iteration, as might happen if the collection permits
- * concurrent modification during iteration. The {@code size} method is
- * called only as an optimization hint; the correct result is returned
- * even if the iterator returns a different number of elements.
- *
- * <p>This method is equivalent to:
- *
- * <pre> {@code
- * List<E> list = new ArrayList<E>(size());
- * for (E e : this)
- * list.add(e);
- * return list.toArray();
- * }</pre>
- */
- public Object[] toArray() {
- // Estimate size of array; be prepared to see more or fewer elements
- Object[] r = new Object[size()];
- Iterator<E> it = iterator();
- for (int i = 0; i < r.length; i++) {
- if (! it.hasNext()) // fewer elements than expected
- return Arrays.copyOf(r, i);
- r[i] = it.next();
- }
- return it.hasNext() ? finishToArray(r, it) : r;
- }
- /**
- * {@inheritDoc}
- *
- * <p>This implementation returns an array containing all the elements
- * returned by this collection's iterator in the same order, stored in
- * consecutive elements of the array, starting with index {@code 0}.
- * If the number of elements returned by the iterator is too large to
- * fit into the specified array, then the elements are returned in a
- * newly allocated array with length equal to the number of elements
- * returned by the iterator, even if the size of this collection
- * changes during iteration, as might happen if the collection permits
- * concurrent modification during iteration. The {@code size} method is
- * called only as an optimization hint; the correct result is returned
- * even if the iterator returns a different number of elements.
- *
- * <p>This method is equivalent to:
- *
- * <pre> {@code
- * List<E> list = new ArrayList<E>(size());
- * for (E e : this)
- * list.add(e);
- * return list.toArray(a);
- * }</pre>
- *
- * @throws ArrayStoreException {@inheritDoc}
- * @throws NullPointerException {@inheritDoc}
- */
- public <T> T[] toArray(T[] a) {
- // Estimate size of array; be prepared to see more or fewer elements
- int size = size();
- T[] r = a.length >= size ? a :
- (T[])java.lang.reflect.Array
- .newInstance(a.getClass().getComponentType(), size);
- Iterator<E> it = iterator();
- for (int i = 0; i < r.length; i++) {
- if (! it.hasNext()) { // fewer elements than expected
- if (a == r) {
- r[i] = null; // null-terminate
- } else if (a.length < i) {
- return Arrays.copyOf(r, i);
- } else {
- System.arraycopy(r, 0, a, 0, i);
- if (a.length > i) {
- a[i] = null;
- }
- }
- return a;
- }
- r[i] = (T)it.next();
- }
- // more elements than expected
- return it.hasNext() ? finishToArray(r, it) : r;
- }
- /**
- * The maximum size of array to allocate.
- * Some VMs reserve some header words in an array.
- * Attempts to allocate larger arrays may result in
- * OutOfMemoryError: Requested array size exceeds VM limit
- */
- private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
- /**
- * Reallocates the array being used within toArray when the iterator
- * returned more elements than expected, and finishes filling it from
- * the iterator.
- *
- * @param r the array, replete with previously stored elements
- * @param it the in-progress iterator over this collection
- * @return array containing the elements in the given array, plus any
- * further elements returned by the iterator, trimmed to size
- */
- private static <T> T[] finishToArray(T[] r, Iterator<?> it) {
- int i = r.length;
- while (it.hasNext()) {
- int cap = r.length;
- if (i == cap) {
- int newCap = cap + (cap >> 1) + 1;
- // overflow-conscious code
- if (newCap - MAX_ARRAY_SIZE > 0)
- newCap = hugeCapacity(cap + 1);
- r = Arrays.copyOf(r, newCap);
- }
- r[i++] = (T)it.next();
- }
- // trim if overallocated
- return (i == r.length) ? r : Arrays.copyOf(r, i);
- }
- private static int hugeCapacity(int minCapacity) {
- if (minCapacity < 0) // overflow
- throw new OutOfMemoryError
- ("Required array size too large");
- return (minCapacity > MAX_ARRAY_SIZE) ?
- Integer.MAX_VALUE :
- MAX_ARRAY_SIZE;
- }
- // Modification Operations
- /**
- * {@inheritDoc}
- *
- * <p>This implementation always throws an
- * <tt>UnsupportedOperationException</tt>.
- *
- * @throws UnsupportedOperationException {@inheritDoc}
- * @throws ClassCastException {@inheritDoc}
- * @throws NullPointerException {@inheritDoc}
- * @throws IllegalArgumentException {@inheritDoc}
- * @throws IllegalStateException {@inheritDoc}
- */
- public boolean add(E e) {
- throw new UnsupportedOperationException();
- }
- /**
- * {@inheritDoc}
- *
- * <p>This implementation iterates over the collection looking for the
- * specified element. If it finds the element, it removes the element
- * from the collection using the iterator's remove method.
- *
- * <p>Note that this implementation throws an
- * <tt>UnsupportedOperationException</tt> if the iterator returned by this
- * collection's iterator method does not implement the <tt>remove</tt>
- * method and this collection contains the specified object.
- *
- * @throws UnsupportedOperationException {@inheritDoc}
- * @throws ClassCastException {@inheritDoc}
- * @throws NullPointerException {@inheritDoc}
- */
- public boolean remove(Object o) {
- Iterator<E> it = iterator();
- if (o==null) {
- while (it.hasNext()) {
- if (it.next()==null) {
- it.remove();
- return true;
- }
- }
- } else {
- while (it.hasNext()) {
- if (o.equals(it.next())) {
- it.remove();
- return true;
- }
- }
- }
- return false;
- }
- // Bulk Operations
- /**
- * {@inheritDoc}
- *
- * <p>This implementation iterates over the specified collection,
- * checking each element returned by the iterator in turn to see
- * if it's contained in this collection. If all elements are so
- * contained <tt>true</tt> is returned, otherwise <tt>false</tt>.
- *
- * @throws ClassCastException {@inheritDoc}
- * @throws NullPointerException {@inheritDoc}
- * @see #contains(Object)
- */
- public boolean containsAll(Collection<?> c) {
- for (Object e : c)
- if (!contains(e))
- return false;
- return true;
- }
- /**
- * {@inheritDoc}
- *
- * <p>This implementation iterates over the specified collection, and adds
- * each object returned by the iterator to this collection, in turn.
- *
- * <p>Note that this implementation will throw an
- * <tt>UnsupportedOperationException</tt> unless <tt>add</tt> is
- * overridden (assuming the specified collection is non-empty).
- *
- * @throws UnsupportedOperationException {@inheritDoc}
- * @throws ClassCastException {@inheritDoc}
- * @throws NullPointerException {@inheritDoc}
- * @throws IllegalArgumentException {@inheritDoc}
- * @throws IllegalStateException {@inheritDoc}
- *
- * @see #add(Object)
- */
- public boolean addAll(Collection<? extends E> c) {
- boolean modified = false;
- for (E e : c)
- if (add(e))
- modified = true;
- return modified;
- }
- /**
- * {@inheritDoc}
- *
- * <p>This implementation iterates over this collection, checking each
- * element returned by the iterator in turn to see if it's contained
- * in the specified collection. If it's so contained, it's removed from
- * this collection with the iterator's <tt>remove</tt> method.
- *
- * <p>Note that this implementation will throw an
- * <tt>UnsupportedOperationException</tt> if the iterator returned by the
- * <tt>iterator</tt> method does not implement the <tt>remove</tt> method
- * and this collection contains one or more elements in common with the
- * specified collection.
- *
- * @throws UnsupportedOperationException {@inheritDoc}
- * @throws ClassCastException {@inheritDoc}
- * @throws NullPointerException {@inheritDoc}
- *
- * @see #remove(Object)
- * @see #contains(Object)
- */
- public boolean removeAll(Collection<?> c) {
- boolean modified = false;
- Iterator<?> it = iterator();
- while (it.hasNext()) {
- if (c.contains(it.next())) {
- it.remove();
- modified = true;
- }
- }
- return modified;
- }
- /**
- * {@inheritDoc}
- *
- * <p>This implementation iterates over this collection, checking each
- * element returned by the iterator in turn to see if it's contained
- * in the specified collection. If it's not so contained, it's removed
- * from this collection with the iterator's <tt>remove</tt> method.
- *
- * <p>Note that this implementation will throw an
- * <tt>UnsupportedOperationException</tt> if the iterator returned by the
- * <tt>iterator</tt> method does not implement the <tt>remove</tt> method
- * and this collection contains one or more elements not present in the
- * specified collection.
- *
- * @throws UnsupportedOperationException {@inheritDoc}
- * @throws ClassCastException {@inheritDoc}
- * @throws NullPointerException {@inheritDoc}
- *
- * @see #remove(Object)
- * @see #contains(Object)
- */
- public boolean retainAll(Collection<?> c) {
- boolean modified = false;
- Iterator<E> it = iterator();
- while (it.hasNext()) {
- if (!c.contains(it.next())) {
- it.remove();
- modified = true;
- }
- }
- return modified;
- }
- /**
- * {@inheritDoc}
- *
- * <p>This implementation iterates over this collection, removing each
- * element using the <tt>Iterator.remove</tt> operation. Most
- * implementations will probably choose to override this method for
- * efficiency.
- *
- * <p>Note that this implementation will throw an
- * <tt>UnsupportedOperationException</tt> if the iterator returned by this
- * collection's <tt>iterator</tt> method does not implement the
- * <tt>remove</tt> method and this collection is non-empty.
- *
- * @throws UnsupportedOperationException {@inheritDoc}
- */
- public void clear() {
- Iterator<E> it = iterator();
- while (it.hasNext()) {
- it.next();
- it.remove();
- }
- }
- // String conversion
- /**
- * Returns a string representation of this collection. The string
- * representation consists of a list of the collection's elements in the
- * order they are returned by its iterator, enclosed in square brackets
- * (<tt>"[]"</tt>). Adjacent elements are separated by the characters
- * <tt>", "</tt> (comma and space). Elements are converted to strings as
- * by {@link String#valueOf(Object)}.
- *
- * @return a string representation of this collection
- */
- public String toString() {
- Iterator<E> it = iterator();
- if (! it.hasNext())
- return "[]";
- StringBuilder sb = new StringBuilder();
- sb.append('[');
- for (;;) {
- E e = it.next();
- if(e instanceof String){
- sb.append(e == this ? "(this Collection)" :"'"+ e+"'");
- }else{
- sb.append(e == this ? "(this Collection)" : e);
- }
- if (! it.hasNext())
- return sb.append(']').toString();
- sb.append(',').append(' ');
- }
- }
- }
|