0

私はJavaを勉強しputていますが、Javaハッシュテーブルにデータを追加するために使用するのに問題があります。

私はこのコードを持っています

double finalIDF = 0.0;
double finalIDF = 0.0;
double finalBM = 0.0;

ArrayList<Double> finalTMlist = new ArrayList<Double>();
 Hashtable<String, ArrayList<Double>> BM25TFIDF = new Hashtable<String, ArrayList<Double>>();
 String[] bm25QueryList // this is the array to store strings like {hey , good , by}

 for(int finalindex = 0; finalindex < bm25QueryList.length ; finalindex++)
{
actualTFvalueforEachDoc.clear();
finalTMlist.clear();
finalIDF = 0.0;
finalIDF = htBM25IDF.get(bm25QueryList[finalindex]);
finalTMlist = tfForAlldoc.get(bm25QueryList[finalindex]);


 for(int innerfinal = 0 ; innerfinal < finalTMlist.size() ; innerfinal++ ){
 finalTM =finalTMlist.get(innerfinal);
finalBM =  finalIDF * finalTM;
actualTFvalueforEachDoc.add(finalBM); 
finalTM = 0.0;
finalBM = 0.0;   }
 BM25TFIDF.put(bm25QueryList[finalindex], actualTFvalueforEachDoc);
 System.out.println("Right before final step after BM25TFIDF " + BM25TFIDF);  }

ArrayList<Double>キーを使用してをハッシュテーブルに入れたいと思いStringます。

ループを初めて通過したときにキーを取得しました"orange"

Right before final step after BM25TFIDF {orange=[1.1698113207547172, 1.0508474576271187, 0.8682367918523235, 1.6330439988027539, 0.8938401048492793, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0133729569093612, 0.0]}

大丈夫です

"bye"ただし、2番目の文字列キーを使用して2番目の配列リストを挿入すると、次のようになります。

BM25TFIDF後の最終ステップの直前{orange=[0.0、0.0、0.0、0.0、0.0、0.0、0.0、4.238037326690413、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0] 、bye = [0.0、0.0、0.0、0.0、0.0、0.0、0.0、4.238037326690413、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0]}

最初の配列リストを上書きしています。文字列配列を使用して毎回キーを変更したので、発生しないはずです。

それが書き続けている理由はよくわかりません。

誰かが理由を知っていますか?

4

3 に答える 3

6

finalTmList.clear()forループでは実行しないでください。これにより、が指すリストがクリアされ、finalTmListその後、そのリストを指すすべての参照がクリアされます。

にリストを追加するときは、同じを指すのではなく、Mapのコピーを追加するのではないためです。したがって、その参照、またはリストを指す参照を使用して変更を加えると、すべての参照に反映されます。ListcopyList ReferenceListlist

マップのエントリごとに、forループに新しいリストを作成する必要があります。

finalTMlist = new ArrayList<Double>();

上記のステートメントを最初のforループ内に移動します。

for(int finalindex = 0; finalindex < bm25QueryList.length ; finalindex++) {
    finalTMlist = new ArrayList<Double>();
    // Your rest code.

actualTFvalueforEachDoc.clear()また、コードに宣言が表示されないので、それが何であれ、同じことに従ってください。

于 2012-11-09T18:43:29.537 に答える
1

You should make a new ArrayList for each entry in the map.

于 2012-11-09T18:46:08.470 に答える
1

新しい反復を開始する前に、新しい配列リストを作成する必要があります

actualTFvalueforEachDoc = new ArraList<Double>();
于 2012-11-09T18:50:24.047 に答える