Mega Code Archive

 
Categories / Java / Collections Data Structure
 

Acts like an java util ArrayList but for primitive long values

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