Collections Data Structure Java

/*
 *  Tiled Map Editor, (c) 2004-2006
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  Adam Turk 
 *  Bjorn Lindeijer 
 */
//package tiled.util;
import java.util.Iterator;
import java.util.Vector;
/**
 * A NumberedSet is a generic container of Objects where each element is
 * identified by an integer id. Unlike with a Vector, the mapping between id and
 * element remains unaffected when elements are deleted. This means that the set
 * of ids for a NumberedSet may not be contiguous. (A sparse array)
 * 
 * @author rainerd
 */
public class NumberedSet {
  private Vector data;
  /**
   * Constructs a new empty NumberedSet.
   */
  public NumberedSet() {
    data = new Vector();
  }
  /**
   * Returns the element for a specific element, or null if the id does not
   * identify any element in this NumberedSet.
   * 
   * @param id
   * @return Object
   */
  public Object get(int id) {
    try {
      return data.get(id);
    } catch (ArrayIndexOutOfBoundsException e) {
    }
    return null;
  }
  /**
   * Returns true if the NumberedSet contains an element for the specified id.
   * 
   * @param id
   * @return boolean
   */
  public boolean containsId(int id) {
    return get(id) != null;
  }
  /**
   * Sets the element for the specified id, replacing any previous element
   * that was associated with that id. id should be a relatively small
   * positive integer.
   * 
   * @param id
   * @param o
   * @return int
   * @throws IllegalArgumentException
   */
  public int put(int id, Object o) throws IllegalArgumentException {
    if (id < 0)
      throw new IllegalArgumentException();
    // Make sure there is sufficient space to overlay
    for (int i = id - data.size(); i > 0; i--) {
      data.add(null);
    }
    data.add(id, o);
    return id;
  }
  /**
   * Removes the element associated with the given id from the NumberedSet.
   * 
   * todo: this function shifts the ids of any subsequent elements!
   * 
   * @param id
   */
  public void remove(int id) {
    data.remove(id);
  }
  /**
   * Returns the last id in the NumberedSet that is associated with an
   * element, or -1 if the NumberedSet is empty.
   * 
   * @return int
   */
  public int getMaxId() {
    int maxId = data.size() - 1;
    while (maxId >= 0) {
      if (data.get(maxId) != null) {
        break;
      }
      maxId--;
    }
    return maxId;
  }
  /**
   * Returns an iterator to iterate over the elements of the NumberedSet.
   * 
   * @return NumberedSetIterator
   */
  public Iterator iterator() {
    return data.iterator();
  }
  /**
   * Adds a new element to the NumberedSet and returns its id.
   * 
   * @param o
   * @return int
   */
  public int add(Object o) {
    int id = getMaxId() + 1;
    put(id, o);
    return id;
  }
  /**
   * Returns the id of the first element of the NumberedSet that is euqal to
   * the given object, or -1 otherwise.
   * 
   * @param o
   */
  public int indexOf(Object o) {
    return data.indexOf(o);
  }
  /**
   * Returns true if at least one element of the NumberedSet is equal to the
   * given object.
   */
  public boolean contains(Object o) {
    return data.contains(o);
  }
  /**
   * If this NumberedSet already contains an element equal to the given
   * object, return its id. Otherwise insert the given object into the
   * NumberedSet and return its id.
   */
  public int findOrAdd(Object o) {
    int id = indexOf(o);
    if (id != -1)
      return id;
    return add(o);
  }
  /**
   * Returns the number of actual elements in the NumberedSet.
   * 
   * @return int
   */
  public int size() {
    return data.size();
  }
}