2014-03-27 214 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