2

NumList という ADT を作成し、NumArrayList クラスに実装しました。

実装されたメソッドのうち、配列 [i] に値が挿入される insert(int i, double value) があります。

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();

同じクラスに組み込まれた私のテストコード領域です。

コンパイラが ArrayIndexOutOfBoundsException を行 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 の配列の長さを 2 倍にしても、新しい配列の長さは 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

配列に場所を割り当てたら、配列items = new double[0];のサイズを変更できないとしましょう。配列が 0 に初期化されている場合、それは配列が役に立たないことを意味します。何を追加しても、Array index out of bounds 例外がスローされます。

その方法は、コレクション、特にListインターフェイスを使用することです。

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

ArrayListLinkedListなど、よりニーズに合ったList の他の実装もあります。

于 2012-09-27T22:32:20.990 に答える
0

配列は常に 1 ではなくインデックス 0 で始まることを覚えておく必要があります。したがって、配列サイズが 10 の場合、最大インデックスは 10 ではなく 9 です。

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

などなど

10 個の要素があると仮定すると、10 番目の要素は tempItems[9] になります。tempItems[10] にアクセスしようとすると、表示されている例外がスローされます。基本的に、最後のインデックスを探している場合は、次のようにします。

tempItems[items.length-1] = value;

編集:これを忘れてください。初期化時に配列インデックスを 2 倍にしています。上記の 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 に答える