Search code examples
javaarraysgenericsgetbluej

Generic Array List


I need to create an array list using generics. My add method seems to work sometimes, however my get method appears to have a good amount of problems and i don't receive a compile error. However when i try to get an object from the Array list using my get method it throws a java out of bounds exception. here i what i have so far, and i am using BlueJ. Also, the instructions were to set the initial "illusion" length to zero.

public class AL <X> {
    private X[]data;
    private int count;

    public  AL() {
        count = 0;
        data = (X[]) new Object[0];
    }

    public void add (X v) {
        if (data.length != count) {
            data[count] = v;
            count++;
        } else {
            X [] newdata = (X[]) new Object[data.length * 2];
            for (int i = 0; i < data.length; i++) {
                newdata[i] = data [i];
            }
            count++;
            data = newdata;
        }
    }

    public X get(int index) {
        if (index >= count || index < 0) {
            throw new ICantEven();
        } else {
            return data[index];
        }
    }
}

Solution

  • Your add method doesn't work, since the initial backing array you are using has a 0 length, which remains 0 even when you try to double it (since 0*2==0).

    You also forgot to actually add the new element when you resize the backing array. If you hadn't forgot that, you'd get the exception in add.

    First of all, change the initial size of the array created by your constructor to be positive :

    data = (X[]) new Object[10];
    

    Then add

    data[count] = v;
    

    to the else clause of your add method (just before count++;).

    Your add method can be further simplified :

    public  AL()
    {
        count = 0;
        data = (X[]) new Object[10];
    }
    
    public void add (X v)
    {
        // resize backing array if necessary
        if (data.length == count)
        {
            X [] newdata = (X[]) new Object[data.length * 2];
            for (int i = 0; i < data.length;i++ )
            {
                newdata[i] = data [i];
            }
            data = newdata;
        }
        // add new element
        data[count] = v;
        count++;
    }