[英]Adding new Key Value Pair Replaces all values in Java HashMap
我有一個HaspMap,其中有“文本”對象作為鍵,有“整數”對象作為值。 該值實際上是我的代碼中該鍵的出現次數。 因此,它第一次是1,然后一直遞增。 代碼如下所示。
首先,我檢查地圖中是否存在給定的“文本”對象。 如果沒有,那么我將其作為鍵與值1一起添加到地圖中。但是我面臨的問題是,由於某種原因,當我通過“ put”功能將新的鍵和值添加到地圖中時,地圖中以前存在的鍵/值對將替換為新的鍵/值對。 代碼如下。
public class WordPatternReducer extends Reducer<IntWritable,Text, Text, IntWritable>{
private IntWritable totalWordCount = new IntWritable();
private Map<Text,Integer> valueCount=new HashMap<Text,Integer>();
private Map<IntWritable,HashMap<Text,Integer>> posMap=new HashMap<IntWritable, HashMap<Text, Integer>>();
@Override
public void reduce(IntWritable key, Iterable<Text> values, Context context)
throws IOException, InterruptedException {
Iterator<Text> it=values.iterator();
Integer maxCountInteger=new Integer(1);
Text maxOccurText = null;
Text newval=new Text();
while (it.hasNext()) {
newval=it.next();
System.out.println("The new val outside is"+newval);
if (valueCount.containsKey(newval)) {
System.out.println("The new val inside if is"+newval);
valueCount.put(newval, (valueCount.get(newval)+1));
} else {
System.out.println(newval);
valueCount.put(newval, 1);
System.out.println(valueCount.toString());
}
maxOccurText=newval;
} }}
因此,對現有鍵的檢查一直在進行,因為它總是轉到else語句。 但是這些價值觀正在被取代。 在輸出控制台中,我得到以下輸出。
The new val outside isWelcome
Welcome
{Welcome=1}
The new val outside isservice service
{service=1, service=1}
The new val outside isversions versions
{versions=1, versions=1, versions=1}
The new val outside isto
to
{to=1, to=1, to=1, to=1}
The new val outside isproviders,
providers,
{providers,=1, providers,=1, providers,=1, providers,=1, providers,=1}
The new val outside isof of
{of=1, of=1, of=1, of=1, of=1, of=1}
The new val outside isthe the
{the=1, the=1, the=1, the=1, the=1, the=1, the=1}
The new val outside issome some
{some=1, some=1, some=1, some=1, some=1, some=1, some=1, some=1}
等等..
我不想這樣。 我只想添加保留舊舊鍵對的新鍵值對。 有人可以讓我知道我做錯了什么嗎? 先感謝您。
Text
是什么課?
假設1: 根據合同, Text
未實現equals()
和hashCode()
。 那會弄亂地圖。
假設2: Text
是可變的,並且在迭代過程中會發生變化。 在地圖中使用String鍵可以解決此問題。
您正在地圖中存儲對newval的引用。 containsKey(newval)檢查是否為false,因為Text檢查其內容是否相同,但是put調用存儲了對您重復放入映射中的相同newval的引用(該引用僅包含讀入的最新字符串)。 嘗試將地圖更改為String,Int的地圖,然后調用map.put(newval.toString())進行啟動,這將為您提供更好的解決方案。 否則,在迭代器循環中聲明newval,以便您每次都在映射中存儲一個新的Text對象(Text newval = it.next())。
看來您的Text
值是可變的。 Iterable values
對象的實現是什么? 它是一個解析器,它反復返回相同的令牌實例,並在每次調用next()
修改其類型和文本嗎? 如果是這樣,則需要將文本復制到一個新的不可變對象(可能只是一個String
,並使用該不可變令牌作為鍵。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.