1

リンク リストの ArrayList にキーと値のペアを格納する Java でハッシュ テーブル クラスを作成したいと考えています。私は宣言することによってこれを行います

 ArrayList<LinkedList<T>> storage = new ArrayList();

次に、arrayList の各インデックス内に新しいリンク リストを作成するために使用できる linkList オブジェクトを作成します。これを行うには、次のように宣言します。

  LinkedList<T> list = new LinkedList<T>();

次に、arrayList の Hashed キー インデックス内にある LinkedList の最初のインデックスに要素を追加するように add 関数を設定しました。

public void add(K key, T value){    
int arrayListIndex = (key.hashCode()) % this.initialCapacity;
    System.out.println(arrayListIndex); //This tells us where we access the Array List;


    if (hashBrown.get(arrayListIndex) == null){

        hashBrown.add(arrayListIndex, list);
        hashBrown.get(arrayListIndex).addFirst(value);
    }
}

このコードを実行するたびに、インデックスが 7 でサイズが 0 のエラーが表示されます。これにより、次のエラーが発生します。

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 7, Size: 0
    at java.util.ArrayList.rangeCheck(ArrayList.java:571)
    at java.util.ArrayList.get(ArrayList.java:349)
    at FastHashtable.add(FastHashtable.java:72)
    at FastHashtable.main(FastHashtable.java:145)

このインデックスの範囲外エラーがどこから来ているのかを突き止めることができません。誰かがアドバイスを提供できますか? 私はArrayListsを扱うことにかなり慣れていないため、arrayListの元の宣言が間違っていると思います。

4

2 に答える 2

4

ArrayList容量とそのサイズ混同しています。Oracle Java ドキュメントから:

ArrayListインスタンスには容量があります。容量は、リスト内の要素を格納するために使用される配列のサイズです。常に少なくともリスト サイズと同じ大きさです。要素が に追加されるとArrayList、その容量は自動的に増加します。成長ポリシーの詳細は、要素の追加には一定の償却時間コストがあるという事実以外は指定されていません。

Object[] a = new Object[maxSize]代わりに、任意のインデックス値で実際にオブジェクト (この場合はリンクされたリスト) を割り当てることができる単純な配列 (例: ) の作成を検討する必要があります。リンクされたリストのみを保存する場合は、LinkedList<T>[]配列を作成します。

于 2012-11-10T22:51:55.297 に答える
3

要素が 0 の場合、インデックス 7 のリストに追加することはできません。add最後に (インデックスなしのメソッドを使用して)、または現在のリストの より大きくない位置にのみ追加できますsize()

リストが空で、インデックス 7 に何かを追加すると、リストの最初の位置には何が含まれ、インデックス 6 には何が含まれると予想されますか? null(加算インデックスがリスト サイズよりも大きい場合に、インデックスまですべてを埋めるために list のサブクラスを作成したことがありますが、この動作はListのセマンティクスの一部になるほど普遍的ではありません。


[ここのコメントとプラセオジムの回答に応じて編集]

それぞれの位置が最初にアクセスされたときに、(配列) リストを null で埋めるだけで、それらをリンクされたリストに置き換えることができます。(ただし、必ずsetand ではなくを使用してくださいadd。これはおそらく上記でも必要です。) または、目的のサイズの配列 (デフォルトでは s でいっぱいになる) を作成し、nullそれを ( に「ラップ」することもできます。サイズ変更不可) 経由のリストArrays.asList。ただし、「未チェックの変換」警告を無視する必要があります (配列を使用するときに警告を回避できるわけではありません)。また、「実装ではなくインターフェイスへのプログラム」を読むことをお勧めします。

于 2012-11-10T22:48:39.233 に答える