在java中使用嵌套泛型时的奇怪结果

时间:2014-02-02 12:14:22

标签: java generics arraylist hashmap

我正在对当前使用该结构的代码块做一些工作。

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的值会在之前的某个时间点重置。这与所有单词相同,所以当它完成运行时,所有单词都有相同的几组整数。

显然我做错了吗?

1 个答案:

答案 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);
}