Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的哈希表覆盖问题_Java_Arraylist_Hashtable_Overwrite - Fatal编程技术网

java中的哈希表覆盖问题

java中的哈希表覆盖问题,java,arraylist,hashtable,overwrite,Java,Arraylist,Hashtable,Overwrite,我正在学习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 Has

我正在学习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时,我得到

[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、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.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、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、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0 0、0、0、0、0、0、0、0]}

它正在覆盖第一个arraylist。我每次都使用字符串数组来更改密钥,所以不应该发生这种情况

我真的不确定它为什么总是写得太多


有人知道原因吗?

不要在for循环中执行
finalTmList.clear()
。这将清除
finalTmList
指向的列表,并随后清除指向该列表的所有引用

因为,当您将列表添加到
地图
时,您并不是在添加
列表
的副本,而是指向同一
列表
列表引用的
副本
。因此,您使用该引用对该
列表所做的任何更改,或指向该列表的任何引用,都将反映在所有引用中

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

finalTMlist = new ArrayList<Double>();
finalTMlist=newarraylist();
将上述语句移动到第一个for循环中

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

对于
actualTFvalueforEachDoc.clear()
同样,不管它是什么,因为我看不到代码中的声明。

你应该为映射中的每个条目创建一个新的
ArrayList

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

actualTFvalueforEachDoc = new ArraList<Double>();
actualTFvalueforEachDoc=newarralist();

您将同一个列表放入表中两次,因为您只执行过一次
新建ArrayList()
操作。感谢它能正常工作,我将ActualTvValueForEachDoc和FinalTmlList更改为新建ArrayList();。然后它就正常工作了。我认为这都是局部变量(我认为可以清除)。如果您觉得合适,您能解释一下引用吗?@DcRedwing..编辑了第一段。您可以看到它。@DcRedwing..添加了一些内容。谢谢!!!它很有效!!!根据was,“.clear()”和“new ArrayList”之间的区别是什么?@DcRedwing这是一个关于OOP方法的长时间讨论,简而言之,对象变量是引用而不是值,因此在映射中放置相同的列表,即使它们位于不同的条目中,也将指向相同的列表,因此
.clear()
将清除所有条目中的列表,而新列表将允许区分一个列表与另一个列表。
actualTFvalueforEachDoc = new ArraList<Double>();