簡體   English   中英

添加新的鍵值對將替換Java HashMap中的所有值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM