NumberedSet.java Source code

Java tutorial

Introduction

Here is the source code for NumberedSet.java

Source

/*
 *  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 <aturk@biggeruniverse.com>
 *  Bjorn Lindeijer <bjorn@lindeijer.nl>
 */

//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();
    }
}