1

ハッシュ テーブルの背後にある考え方は理解できますが、実装がイライラします。私はいくつかの読書をして、さまざまな答えを得ました。次のように、オブジェクトの汎用配列を実装できることを読みました。

TableContainer[] classTable = 
    (TableContainer<Object,Object>[]) new TableContainer[256];

ここで、tableContainer は次のとおりです。

class TableContainer<key,val>{
    Object key = null;
    Object val = null;
}

私が抱えている問題は、次のコードを関数に渡そうとしたときです。

classTable[i].key = x

null ポインター例外が発生します。タイプ消去のためにJavaでジェネリック配列を作成すると面倒になることは理解していますが、上記の実装でうまくいくと思いました。ハッシュテーブルとして利用するジェネリックのリストまたは配列を作成する方法はありますか? (ハッシュテーブル/ハッシュマップ クラスは許可されません)

4

2 に答える 2

6

オブジェクト参照を使用する前に、配列内のオブジェクト参照を初期化する必要があります。そのようです

tableContainer[] a = new tableContainer<Whatever, SomeClass>[SIZE];
for ( int i = 0 ; i < a.length; i++ ) {
     a[i] = new tableContainer<Whatever, SomeClass>();
}

もちろん、例とは異なり、配列を0より大きいサイズに初期化する必要があります。

于 2012-11-11T19:48:48.217 に答える
3

まず、空の配列を作成しています:

new TableContainer[0]

また、時間の経過とともに配列のサイズを変更できないため、あまり意味がありません。何らかの正のサイズの配列を実際に作成する場合、1 つのことを覚えておく必要があります。つまり、参照の配列を作成したということです。また、デフォルトでは、各配列はデフォルト (ゼロ) 値に初期化されます。これはたまたまnull参照用です。

したがって、次のようなものが必要です。

classTable = new TableContainer[8];
classTable[0] = new TableContainer();
//...later
if(classTable[0] != null) {  //will pass for [0], but not for [1]
  classTable[0].key
}
于 2012-11-11T19:49:10.360 に答える