package net.jrtechs.www.DataStructures.Lists.ArrayList;
|
|
|
|
import net.jrtechs.www.DataStructures.Lists.IList;
|
|
|
|
|
|
/**
|
|
* Implementation of {@link IList}. This implementation of an
|
|
* array list stores data in an array and resizes when necessary
|
|
* to fit more data. This dsta structure is intended to
|
|
* be used for O(1) access on indexes. Although insertions and
|
|
* deletions worst case is O(n),however, the average is closer to O(1)
|
|
* since array re-sizes don't commonly occur.
|
|
*
|
|
* @param <E> generic stored in data structure
|
|
*
|
|
* @author Jeffery Russell 8-26-18
|
|
*/
|
|
public class ArrayBackedList<E> implements IList<E>
|
|
{
|
|
/** Default size to increase size of array by */
|
|
private int arraySegmentSize = 20;
|
|
|
|
/** How many elements are currently in list */
|
|
private int currentSize = 0;
|
|
|
|
/** Array to store data elements in --
|
|
* is an array of Objects since you can't
|
|
* create a list of generics*/
|
|
private Object[] dataList;
|
|
|
|
|
|
/**
|
|
* Creates an empty list
|
|
*/
|
|
public ArrayBackedList()
|
|
{
|
|
this.dataList = new Object[this.arraySegmentSize];
|
|
}
|
|
|
|
|
|
/**
|
|
* Specifies the size at which the array will be resized to
|
|
*
|
|
* @param size default size of array chunk
|
|
*/
|
|
public ArrayBackedList(int size)
|
|
{
|
|
this.arraySegmentSize = size;
|
|
this.dataList = new Object[size];
|
|
}
|
|
|
|
|
|
/**
|
|
* Adds an element to the end of the list
|
|
*
|
|
* @param o element to get added
|
|
* @return whether element was added
|
|
*/
|
|
@Override
|
|
public boolean add(E o)
|
|
{
|
|
makeArrayLarger();
|
|
this.dataList[currentSize] = o;
|
|
this.currentSize++;
|
|
return true;
|
|
}
|
|
|
|
|
|
/**
|
|
* Makes the array used to store the elements larger if it is necessary
|
|
* for storing more data in the array.
|
|
*/
|
|
private void makeArrayLarger()
|
|
{
|
|
if(this.currentSize + 1 > dataList.length)
|
|
{
|
|
Object[] data = new Object[dataList.length + arraySegmentSize];
|
|
|
|
for(int i = 0; i < this.dataList.length; i++)
|
|
data[i] = this.dataList[i];
|
|
this.dataList = data;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Determines if the list contains a certain element.
|
|
*
|
|
* @param o element to see if exists
|
|
* @return whether element is in list
|
|
*/
|
|
@Override
|
|
public boolean contains(E o)
|
|
{
|
|
for(int i = 0; i < currentSize; i++)
|
|
if(dataList[i].equals(o))
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
|
|
/**
|
|
* Returns the size of the list
|
|
*
|
|
* @return
|
|
*/
|
|
@Override
|
|
public int size()
|
|
{
|
|
return this.currentSize;
|
|
}
|
|
|
|
|
|
/**
|
|
* Removes the element at a certain index.
|
|
*
|
|
* @Warning this can go out of bounds
|
|
*
|
|
* @param index of element to remove
|
|
* @return element removed
|
|
*/
|
|
@Override
|
|
public E remove(int index)
|
|
{
|
|
Object old = this.dataList[index];
|
|
|
|
for(int i = index; i < this.currentSize -1; i++)
|
|
{
|
|
this.dataList[i] = this.dataList[i + 1];
|
|
}
|
|
this.currentSize--;
|
|
return (E)old;
|
|
}
|
|
|
|
|
|
/**
|
|
* Removes an element from an array if it exists. If it does
|
|
* not exist in the array, null is returned.
|
|
*
|
|
* @param o element to remove
|
|
* @return element removed
|
|
*/
|
|
@Override
|
|
public E remove(E o)
|
|
{
|
|
for(int i = 0; i < this.currentSize; i++)
|
|
{
|
|
if(this.dataList[i].equals(o))
|
|
{
|
|
return remove(i);
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
|
|
/**
|
|
* Returns the element at a desired index in O(1) time.
|
|
*
|
|
* @Warning This can go out of bounds with bad input
|
|
*
|
|
* @param index of desired element
|
|
* @return element of a specific index
|
|
*/
|
|
@Override
|
|
public E get(int index)
|
|
{
|
|
return (E)dataList[index];
|
|
}
|
|
}
|