通用阵列列表

时间:2016-09-28 07:33:41

标签: java arrays generics get bluej

我需要使用泛型创建数组列表。我的添加方法似乎有时工作,但是我的get方法似乎有很多问题而且我没有收到编译错误。但是当我尝试使用我的get方法从Array列表中获取一个对象时,它会抛出一个java out of bounds异常。在这里,我到目前为止,我正在使用BlueJ。此外,指示是设置初始"错觉"长度为零。

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];
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您的add方法不起作用,因为您使用的初始后备阵列的长度为0,即使您尝试将其加倍(从0 * 2 == 0),该长度也保持为0。

在调整后备阵列大小时,您也忘了实际添加新元素。如果您没有忘记这一点,那么您将在add中获得例外。

首先,将构造函数创建的数组的初始大小更改为正数:

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

然后添加

data[count] = v;

add方法的else子句(就在count++;之前)。

您的添加方法可以进一步简化:

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++;
}