LongList.java Source code

Java tutorial

Introduction

Here is the source code for LongList.java

Source

/*
 * LongList.java Created Aug 3, 2010 by Andrew Butler, PSL
 */
//package prisms.util;

/**
 * Acts like an {@link java.util.ArrayList} but for primitive long values
 */
public class LongList {
    private long[] theValue;

    private int theSize;

    /**
     * Creates a list with a capacity of 5
     */
    public LongList() {
        this(5);
    }

    /**
     * Creates a list with a set capacity
     * 
     * @param size
     *            The initial capacity of the list
     */
    public LongList(int size) {
        theValue = new long[size];
    }

    /**
     * Creates a list with a set of values
     * 
     * @param values
     *            The values for the list
     */
    public LongList(long[] values) {
        theValue = values;
        theSize = values.length;
    }

    /**
     * @return The number of elements in the list
     */
    public int size() {
        return theSize;
    }

    /**
     * @return Whether this list is empty of elements
     */
    public boolean isEmpty() {
        return theSize == 0;
    }

    /**
     * Clears this list, setting its size to 0
     */
    public void clear() {
        theSize = 0;
    }

    /**
     * Gets the value in the list at the given index
     * 
     * @param index
     *            The index of the value to get
     * @return The value at the given index
     */
    public long get(int index) {
        if (index < 0 || index >= theSize)
            throw new ArrayIndexOutOfBoundsException(index);
        return theValue[index];
    }

    /**
     * Adds a value to the end of this list
     * 
     * @param value
     *            The value to add to the list
     */
    public void add(long value) {
        ensureCapacity(theSize + 1);
        theValue[theSize++] = value;
    }

    /**
     * Adds a value to this list at the given index
     * 
     * @param index
     *            The index to add the value at
     * @param value
     *            The value to add to the list
     */
    public void add(int index, long value) {
        if (index < 0 || index > theSize)
            throw new ArrayIndexOutOfBoundsException(index);
        ensureCapacity(theSize + 1);
        for (int i = theSize; i > index; i--)
            theValue[i] = theValue[i - 1];
        theValue[index] = value;
        theSize++;
    }

    /**
     * Adds an array of values to the end of this list
     * 
     * @param value
     *            The values to add
     */
    public void addAll(long[] value) {
        ensureCapacity(theSize + value.length);
        for (int i = 0; i < value.length; i++)
            theValue[theSize + i] = value[i];
        theSize += value.length;
    }

    /**
     * Adds a list of values to the end of this list
     * 
     * @param list
     *            The list of values to add
     */
    public void addAll(LongList list) {
        ensureCapacity(theSize + list.theSize);
        for (int i = 0; i < list.theSize; i++)
            theValue[theSize + i] = list.theValue[i];
        theSize += list.theSize;
    }

    /**
     * Replaces a value in this list with another value
     * 
     * @param index
     *            The index of the value to replace
     * @param value
     *            The value to replace the old value with
     * @return The old value at the given index
     */
    public long set(int index, long value) {
        if (index < 0 || index >= theSize)
            throw new ArrayIndexOutOfBoundsException(index);
        long ret = theValue[index];
        theValue[index] = value;
        return ret;
    }

    /**
     * Removes a value from this list
     * 
     * @param index
     *            The index of the value to remove
     * @return The value that was removed
     */
    public long remove(int index) {
        if (index < 0 || index >= theSize)
            throw new ArrayIndexOutOfBoundsException(index);
        long ret = theValue[index];
        for (int i = index; i < theSize - 1; i++)
            theValue[i] = theValue[i + 1];
        theSize--;
        return ret;
    }

    /**
     * Removes a value from this list
     * 
     * @param value
     *            The value to remove
     * @return Whether the value was found and removed
     */
    public boolean remove(long value) {
        for (int i = 0; i < theSize; i++)
            if (theValue[i] == value) {
                remove(i);
                return true;
            }
        return false;
    }

    /**
     * Removes all instances of the given value from this list
     * 
     * @param value
     *            The value to remove
     * @return The number of times the value was removed
     */
    public int removeAll(long value) {
        int ret = 0;
        for (int i = 0; i < theSize; i++)
            if (theValue[i] == value) {
                remove(i);
                i--;
                ret++;
            }
        return ret;
    }

    /**
     * Adds all elements of a new list that are not present in this list
     * 
     * @param list
     *            The list to add new values from
     */
    public void or(LongList list) {
        int size = theSize;
        for (int i = 0; i < list.size(); i++) {
            long value = list.get(i);
            int j;
            for (j = 0; j < size; j++)
                if (theValue[j] == value)
                    break;
            if (j == size)
                add(value);
        }
    }

    /**
     * Removes all elements of this list that are not present in the given list
     * 
     * @param list
     *            The list to keep elements from
     */
    public void and(LongList list) {
        for (int i = 0; i < theSize; i++) {
            int j;
            for (j = 0; j < list.theSize; j++)
                if (theValue[i] == list.theValue[j])
                    break;
            if (j == list.theSize)
                remove(i);
        }
    }

    /**
     * Determines if this list contains a given value
     * 
     * @param value
     *            The value to find
     * @return Whether this list contains the given value
     */
    public boolean contains(long value) {
        return indexOf(value) >= 0;
    }

    /**
     * Counts the number of times a value is represented in this list
     * 
     * @param value
     *            The value to count
     * @return The number of times the value appears in this list
     */
    public int instanceCount(long value) {
        int ret = 0;
        for (int i = 0; i < theSize; i++)
            if (theValue[i] == value)
                ret++;
        return ret;
    }

    /**
     * Finds a value in this list
     * 
     * @param value
     *            The value to find
     * @return The first index whose value is the given value
     */
    public int indexOf(long value) {
        for (int i = 0; i < theSize; i++)
            if (theValue[i] == value)
                return i;
        return -1;
    }

    /**
     * Finds a value in this list
     * 
     * @param value
     *            The value to find
     * @return The last index whose value is the given value
     */
    public int lastIndexOf(long value) {
        for (int i = theSize - 1; i >= 0; i--)
            if (theValue[i] == value)
                return i;
        return -1;
    }

    /**
     * @return The list of values currently in this list
     */
    public long[] toArray() {
        long[] ret = new long[theSize];
        System.arraycopy(theValue, 0, ret, 0, theSize);
        return ret;
    }

    /**
     * Similary to {@link #toArray()} but creates an array of {@link Long}
     * wrappers
     * 
     * @return The list of values currently in this list
     */
    public Long[] toObjectArray() {
        Long[] ret = new Long[theSize];
        for (int i = 0; i < ret.length; i++)
            ret[i] = new Long(theValue[i]);
        return ret;
    }

    /**
     * Copies a subset of this list's data into an array
     * 
     * @param srcPos
     *            The index in this list to start copying from
     * @param dest
     *            The array to copy the data into
     * @param destPos
     *            The index in the destination array to start copying to
     * @param length
     *            The number of items to copy
     */
    public void arrayCopy(int srcPos, long[] dest, int destPos, int length) {
        int i = srcPos;
        int j = destPos;
        for (int k = 0; k < length; i++, j++, k++)
            dest[j] = theValue[i];
    }

    /**
     * Trims this list so that it wastes no space and its capacity is equal to
     * its size
     */
    public void trimToSize() {
        if (theValue.length == theSize)
            return;
        long[] oldData = theValue;
        theValue = new long[theSize];
        System.arraycopy(oldData, 0, theValue, 0, theSize);
    }

    /**
     * Ensures that this list's capacity is at list the given value
     * 
     * @param minCapacity
     *            The minimum capacity for the list
     */
    public void ensureCapacity(int minCapacity) {
        int oldCapacity = theValue.length;
        if (minCapacity > oldCapacity) {
            long oldData[] = theValue;
            int newCapacity = (oldCapacity * 3) / 2 + 1;
            if (newCapacity < minCapacity)
                newCapacity = minCapacity;
            theValue = new long[newCapacity];
            System.arraycopy(oldData, 0, theValue, 0, theSize);
        }
    }
}