2014-03-27 260 views
0

我正在創建一個wordcount程序,我在其中創建N線程,並且每個線程都收到一個char[]包含許多不同數字的緩衝區,如[2355 3326 94438 123 123...]我想創建一個映射,其中鍵是數字本身,而價值是它出現了多少時間。我將從char[]數組轉換爲一個整數,如下所示。putIfAbsent總是返回null

但是,似乎每次我撥打putIfAbsent()時,它總是返回null,這意味着它沒有找到該值的關鍵字。這沒有意義,因爲我的文本文件中有數千個重複值。該地圖最終應該在300kb左右,而不是一個千兆字節。

newbyte[]char[]只包含數字和空格

爲什麼始終的putIfAbsent返回null?

此外,當我打印的地圖完成後,它看起來像這樣:

233303192 = 1 
1770057208 = 1 
1323329638 = 1 
50 = 1 
962422124 = 1 
472527478 = 1 
936125441 = 1 
-350637153 = 1 
-601349585 = 1 

這是很奇怪的,因爲任何輸入的最大值爲65535不知道如何這使得任何意義。

 public void run() { 
      int counter = 0; int i; Integer check; int j =0; int temp = 0; int intbuilder = 0; 
      for (i = 0; i < newbyte.length; i++) { 
        if (newbyte[i] != ' ') { //delimiter is not found, so add to temp char array 
          intbuilder = (intbuilder * 10) + (int)newbyte[i]; 
          counter++; 
        } 
        else {  
          check = wordCountMap.putIfAbsent(intbuilder, 1); 
          if (check != null) { 
            wordCountMap.put(intbuilder, check + 1); 
          } 
          intbuilder = 0; 
+0

也許不是你的問題,但不是'(INT)newbyte [I]'你可能意味着'(INT)(newbyte [I] - '0')'。 – OldCurmudgeon

+0

你可能是對的,但它沒有幫助。順便說一下,我的映射是ConcurrentHashMap DanGordon

回答

0

該問題不在併發散列映射中。它與你的方式解析字符數組

public void startThreads() throws InterruptedException{ 
     char[] input = {'1',' ','2',' ','3','4',' ','1',' ','2',' ','3','4',' ','1'}; 
     Thread workerThread = new Thread(new Worker(input)); 
     workerThread.start(); 
     workerThread.join(); 
     System.out.println("Count for 1 & 2 are "+countMap.get(1)+" and "+countMap.get(2)); 
    } 

    private class Worker implements Runnable{ 

     private char[] newbyte; 

     public Worker(char[] newbyte){ 
      this.newbyte = newbyte; 
     } 

     @Override 
     public void run() { 
      int number=0; 
      for(int i=0;i< newbyte.length;i++){ 
       if(newbyte[i] != ' '){ 
        number = (number*10)+Character.getNumericValue(newbyte[i]); 
       }else{ 
        Integer currentValue = countMap.putIfAbsent(number, 1); 
        if(currentValue != null){ 
         countMap.put(number, currentValue+1); 
        } 
        number = 0; 
       } 
      } 
      Integer currentValue = countMap.putIfAbsent(number, 1); 
      if(currentValue != null){ 
       countMap.put(number, currentValue+1); 
      } 

     } 

    } 
+0

爲什麼不在循環之前聲明'Integer currentValue'?不知道它是否重要,只是想知道。我沒有試過這個代碼,但我會給它一個鏡頭。它看起來像你說的關鍵區別在這裏:'number =(number * 10)+ Character.getNumericValue(newbyte [i]);' 我對最後三行代碼也有點困惑。它在for循環之外。我猜你不小心寫了兩次該代碼? – DanGordon

+0

好的,所以這段代碼在運行Eclipse時可以在windows上運行,但是當我嘗試通過Linux服務器上的命令行運行這個java程序時,我又得到了瘋狂的結果。 – DanGordon

+0

在循環之後編寫代碼並非偶然..如果最後一個字符不是空格,那麼您將丟失最後一個數字。嘗試沒有輸入最後一個字符的輸入爲''。你是通過Linux服務器上的命令行執行相同的程序,還是它與不同的輸入有所不同?如果你發佈日誌,它會幫助我回答 – yarlee