这真的很奇怪。这是我的代码:
Map<Text,Integer> frequencies = new HashMap<Text,Integer>();
Text currentBrowser = new Text();
// update map with browser frequencies
while(values.hasNext()){
currentBrowser = values.next();
if (frequencies.containsKey(currentBrowser))
frequencies.put(currentBrowser, frequencies.get(currentBrowser) + 1);
else
frequencies.put(currentBrowser, new Integer(1));
}
我的想法是values
是Iterator<Text>
,它包含浏览器列表(Chrome,IE等)。我只是想创建一个存储每个浏览器频率的地图(如果Chrome在列表中出现3次 - 我希望它的值为3,等等。)
麻烦的是,这不起作用。当我逐步调试它时,会发生以下情况:
第一个浏览器是Explorer,它将它正确放入地图中:
{Explorer=1}
。接下来是Safari,所以它会进入else
,但这就是地图发生的事情:{Safari=1, Safari=1}
!接下来的两个浏览器是Safari,它们确实插入了{Safari=1, Safari=3}
,但随后是Firefox,这就是:{Firefox=1, Firefox=1, Firefox=3}
。因此,您可以看到每次将新密钥插入到地图中时,它也会更改所有其他密钥。第一个Firefox应该是Explorer,第二个应该是Firefox,第三个应该是Safari。
这里发生了什么?
答案 0 :(得分:2)
从您的描述看起来您的问题是&#34; currentBrowser&#34;对象实际上并没有改变。含义:在每次迭代期间添加SAME对象;除此之外,您正在更改该对象的INTERNAL表示。
长话短说:我认为问题是你的迭代器一直在返回SAME对象。