2

我制作了一个名为 NumList 的 ADT,并在 NumArrayList 类中实现了它

在实现的方法中,有一个 insert(int i, double value),其中 value 被插入到 array[i] 中。

int numItems 是跟踪我的数组元素的计数器。

public void insert(int i, double value)
{
    if (numItems >= items.length)
    {
        double[] tempItems = new double [items.length * 2];
        for(int j =0 ; j < items.length; j++ )
        {
            tempItems[j] = items[j];

        }

        tempItems[items.length] = value;
        items = tempItems;

    }

    else
    {
        if (i > numItems)
        {
            items[numItems] = value;
        }

        else 
        {
            for (int k = i; k < numItems; k++)
            {
                items[k+1] = items[k];
            }

            items[i] = value;
        }
    }

    numItems++;
}

是我的方法,看起来很简单。

public static void main (String[] args)
{
    NumArrayList test;
    test = new NumArrayList();

    //System.out.println("this is how many initial items the initialized array has.");
    //System.out.println(test.items);
    test.insert(1, 0.1);
    System.out.println("have tried to insert value 0.1 @ position 1, that is the second element in array.");
    test.print();

是我的测试代码区,内置在同一个类中。

我收到一个错误,编译器声称我在第 47 行或在

tempItems[items.length] = value;

我相信它试图告诉我我的项目初​​始化是错误的,

private double[] items;
private int numItems;


public NumArrayList()
{
    items = new double[0];
    numItems = 0;
}

但是初始化已经被一个比我好得多的程序员批准了,这些错误让我无处可去。也许我应该研究程序的哪一部分?

4

4 回答 4

2

您的初始化肯定是错误的。什么是合理的默认尺寸?对于 ArrayList,答案是 10。你可以随心所欲,但不能为零!如果将大小为 0 的数组的长度加倍,则新数组的长度仍为 0。

int capacity; //stores the size of the array (items available)
int numItems; //stores how many items are actually stored in the array.

public NumArrayList()  {
    items = new double[10];
    numItems = 0;
    capacity = 10;
}
于 2012-09-27T22:30:25.450 回答
0

您必须记住,数组始终以索引 0 而不是 1 开头。因此,如果您的数组大小为 10,则最大索引为 9 而不是 10。

tempItems[0] = first element;
tempItems[1] = second element;

等等等等

假设你有 10 个元素,你的第十个元素将在 tempItems[9] 中。尝试访问 tempItems[10] 将引发您看到的异常。基本上,如果您正在寻找最后一个索引,您想要这样做:

tempItems[items.length-1] = value;

编辑:忘记这个。您在初始化时将数组索引加倍。参考上面Thorn的帖子。

于 2012-09-27T22:28:07.357 回答
0

改变这个

    tempItems[items.length] = value;

    tempItems[items.length-1] = value;

数组索引从 0 开始,如果您的数组长度为 5,则最后一个索引为 4

于 2012-09-27T22:31:08.003 回答
0

一旦将位置分配给数组,可以说items = new double[0];您无法更改数组的大小。如果数组初始化为 0,这意味着你有一个无用的数组。您添加到其中的任何内容都会引发 Array index out of bounds 异常。

要走的路是使用集合,特别是列表接口。

List myList = new List(); //Create an empty list
myList.add(item); //adds item to List

还有其他 List 的实现,如ArrayListLinkedList等...可以更好地满足您的需求。

于 2012-09-27T22:32:20.990 回答