Collections Data Structure Java

/**
 * created Dec 12, 2007
 * 
 * @by Marc Woerlein (woerlein@informatik.uni-erlangen.de)
 *
 * Copyright 2007 Marc Woerlein
 * 
 * This file is part of parsemis.
 *
 * Licence: 
 *  LGPL: http://www.gnu.org/licenses/lgpl.html
 *   EPL: http://www.eclipse.org/org/documents/epl-v10.php
 *   See the LICENSE file in the project's top-level directory for details.
 */
//package de.parsemis.utils;
import java.util.Collection;
import java.util.Iterator;
import java.util.NoSuchElementException;
/**
 * 
 * @author Marc Woerlein (woerlein@informatik.uni-erlangen.de)
 * 
 * @param 
 */
public class SortedMultiSet> implements
    Collection, Comparable> {
  Type[] field;
  int size;
  @SuppressWarnings("unchecked")
  public SortedMultiSet() {
    size = 0;
    field = (Type[]) new Comparable[4];
  }
  /*
   * (non-Javadoc)
   * 
   * @see java.util.Collection#add(java.lang.Object)
   */
  @SuppressWarnings("unchecked")
  public boolean add(final Type o) {
    if (o == null) {
      return false;
    }
    Type[] destField = field;
    int pos = 0;
    // skip smaller ones
    while (pos < size && field[pos].compareTo(o) > 0) {
      pos++;
    }
    if (size == field.length) {
      // copy smaller ones
      System.arraycopy(field, 0,
          destField = (Type[]) new Comparable[(int) (size * 1.5)], 0,
          pos);
    }
    // move bigger ones
    System.arraycopy(field, pos, destField, pos + 1, size - pos);
    // insert value
    destField[pos] = o;
    field = destField;
    size++;
    return true;
  }
  /*
   * (non-Javadoc)
   * 
   * @see java.util.Collection#addAll(java.util.Collection)
   */
  public boolean addAll(final Collection c) {
    boolean ret = false;
    for (final Type t : c) {
      ret |= add(t);
    }
    return ret;
  }
  /*
   * (non-Javadoc)
   * 
   * @see java.util.Collection#clear()
   */
  @SuppressWarnings("unchecked")
  public void clear() {
    size = 0;
    field = (Type[]) new Comparable[field.length];
  }
  /*
   * (non-Javadoc)
   * 
   * @see java.lang.Comparable#compareTo(java.lang.Object)
   */
  public int compareTo(final SortedMultiSet o) {
    int c = 0;
    int i = 0;
    while (c == 0) {
      if (i == size) {
        return i == o.size ? 0 : -1;
      }
      if (i == o.size) {
        return 1;
      }
      c = field[i].compareTo(o.field[i]);
      i++;
    }
    return c;
  }
  /*
   * (non-Javadoc)
   * 
   * @see java.util.Collection#contains(java.lang.Object)
   */
  @SuppressWarnings("unchecked")
  public boolean contains(final Object o) {
    return (o instanceof Comparable) && pos((Type) o) >= 0;
  }
  /*
   * (non-Javadoc)
   * 
   * @see java.util.Collection#containsAll(java.util.Collection)
   */
  public boolean containsAll(final Collection c) {
    boolean ret = true;
    for (final Object t : c) {
      ret &= contains(t);
    }
    return ret;
  }
  /*
   * (non-Javadoc)
   * 
   * @see java.lang.Object#equals(java.lang.Object)
   */
  @SuppressWarnings("unchecked")
  @Override
  public boolean equals(final Object obj) {
    return obj instanceof SortedMultiSet
        && compareTo((SortedMultiSet) obj) == 0;
  }
  /*
   * (non-Javadoc)
   * 
   * @see java.lang.Object#hashCode()
   */
  @Override
  public int hashCode() {
    return size();
  }
  /*
   * (non-Javadoc)
   * 
   * @see java.util.Collection#isEmpty()
   */
  public boolean isEmpty() {
    return size == 0;
  }
  /*
   * (non-Javadoc)
   * 
   * @see java.util.Collection#iterator()
   */
  public Iterator iterator() {
    return new Iterator() {
      int idx = 0;
      public boolean hasNext() {
        return idx < size;
      }
      public Type next() {
        if (hasNext()) {
          return field[idx++];
        }
        throw new NoSuchElementException();
      }
      public void remove() {
        throw new UnsupportedOperationException();
      }
    };
  }
  private int pos(final Type t) {
    int c = -1;
    int pos = 0;
    for (; c < 0 && pos < size; pos++) {
      c = field[pos].compareTo(t);
    }
    return c == 0 ? pos : -1;
  }
  /*
   * (non-Javadoc)
   * 
   * @see java.util.Collection#remove(java.lang.Object)
   */
  @SuppressWarnings("unchecked")
  public boolean remove(final Object o) {
    if (o instanceof Comparable) {
      final int pos = pos((Type) o);
      if (pos >= 0) {
        System.arraycopy(field, pos + 1, field, pos, --size - pos);
        return true;
      }
    }
    return false;
  }
  /*
   * (non-Javadoc)
   * 
   * @see java.util.Collection#removeAll(java.util.Collection)
   */
  public boolean removeAll(final Collection c) {
    boolean ret = false;
    for (final Object t : c) {
      ret |= remove(t);
    }
    return ret;
  }
  /*
   * (non-Javadoc)
   * 
   * @see java.util.Collection#retainAll(java.util.Collection)
   */
  public boolean retainAll(final Collection c) {
    int j = 0;
    for (int i = 0; i < size; i++) {
      if (c.contains(field[i])) {
        field[j++] = field[i];
      }
    }
    if (j == size) {
      return false;
    }
    for (; j < size; j++) {
      field[j] = null;
    }
    return true;
  }
  /*
   * (non-Javadoc)
   * 
   * @see java.util.Collection#size()
   */
  public int size() {
    return size;
  }
  /*
   * (non-Javadoc)
   * 
   * @see java.util.Collection#toArray()
   */
  @SuppressWarnings("unchecked")
  public Object[] toArray() {
    return toArray((Type[]) new Comparable[size]);
  }
  /*
   * (non-Javadoc)
   * 
   * @see java.util.Collection#toArray(T[])
   */
  public  T[] toArray(final T[] a) {
    System.arraycopy(field, 0, a, 0, size);
    return a;
  }
}