我正在对当前使用该结构的代码块做一些工作。
HashMap(Text,HashMap(Text,ArrayList(Ints)))
HashMapWritable<Text, ArrayListOfIntsWritable> fileMap =
new HashMapWritable<Text, ArrayListOfIntsWritable>();
HashMapWritable<Text, HashMapWritable<Text, ArrayListOfIntsWritable>> wordMap =
new HashMapWritable<Text, HashMapWritable<Text, ArrayListOfIntsWritable>>();
而且我得到了奇怪的结果,但却难以确定原因。
if (!wordMap.containsKey(newText)) {
ArrayListOfIntsWritable wordPosition = new ArrayListOfIntsWritable();
wordPosition.add(c);
fileMap.put(INPUTFILE, wordPosition);
wordMap.put(newText, fileMap);
} else {
HashMapWritable<Text, ArrayListOfIntsWritable> updatePosStep1 =
wordMap.get(newText);
ArrayListOfIntsWritable updatePosStep2 = updatePosStep1.get(INPUTFILE);
updatePosStep2.add(c);
}
我也尝试过更新:
wordMap.get(newText).get(INPUTFILE).add(c);
但是结果相同。
这一切都是在循环中完成的,发生了什么(示例显示了'newText'='episod'的情况,其中数字是循环中的位置(循环递增c的基本)和[ int,int,...]是已存储的C的值
Word: episod curPos 14 positions: [14]
Word: episod curPos 120 positions: [116, 118, 120]
Word: episod curPos 191 positions: [186, 190, 191]
Word: episod curPos 199 positions: [198, 199]
正如您所看到的(希望它显示我想要了解的内容),键episod
的值会在之前的某个时间点重置。这与所有单词相同,所以当它完成运行时,所有单词都有相同的几组整数。
显然我做错了吗?
答案 0 :(得分:1)
您真的很困惑,您正在使用外部创建的对象&#34; fileMap&#34; at&#39; true&#39;条件,同时接收&quot; updatePosStep1&#39;来自地图“假”&#39;。 猜测,您正在共享&#39; fileMap&#39;的相同实例,或重新创建/重置文件地图&#39;在提出的代码之前的某些条件。
因此,您可能会意外地在&#39; wordPosition&#39;中有额外的值,以及有&#39; wordPosition&#39;在每个新的&text文本中重新创建。
if (!wordMap.containsKey(newText)) {
final HashMapWritable<Text, ArrayListOfIntsWritable> fileMap = new HashMapWritable<Text, ArrayListOfIntsWritable>;
final ArrayListOfIntsWritable wordPosition = new ArrayListOfIntsWritable();
wordPosition.add(c);
fileMap.put(INPUTFILE, wordPosition);
wordMap.put(newText, fileMap);
} else {
final HashMapWritable<Text, ArrayListOfIntsWritable> fileMap =
wordMap.get(newText);
final ArrayListOfIntsWritable wordPosition = fileMap.get(INPUTFILE);
wordPosition.add(c);
}