java中的哈希表覆盖问题
我正在学习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
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>();