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"我得到

在 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.] 之后的最后一步之前, 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的副本List,而是copy您的. 因此,您对该引用所做的任何更改,或指向列表的任何引用,都将反映在所有引用中。List ReferenceListlist

您应该在 for 循环中为 Map 的每个条目创建一个新列表:-

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

您应该ArrayList为地图中的每个条目创建一个新条目。

于 2012-11-09T18:46:08.470 回答
1

您必须在开始新的迭代之前创建一个新的数组列表

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