2013-11-23 11 views
0

該任務是讀取文件的每個單詞並使用地圖計算每個單詞的頻率。然後使用給定的方法sortByValue(Map map)來組織它們。我很困惑如何讓文件正確讀入並將整數值賦給String鍵。幫幫我?我如何讓文件閱讀器沒有異常?

import java.util.*; 
import java.io.*; 
public class WordFrequency { 
    public static void main(String []args) throws IOException { 

    File textFile = new File("book.txt"); 
    BufferedReader in = new BufferedReader(new FileReader(textFile)); 
    TreeMap<String, Integer> frequencyMap = new TreeMap<String, Integer>(); 
    String currentLine; 
    while ((currentLine = in.readLine()) != null) { 
     currentLine = currentLine.toLowerCase(); 


    } 

    StringTokenizer tokenizer = new StringTokenizer(currentLine, " \t\n\r\f.,;:!?'"); 

    while (tokenizer.hasMoreTokens()) { 
     final String currentWord = tokenizer.nextToken(); Integer frequency = frequencyMap.get(currentWord); 
     if (frequency == null) { frequency = 0; } frequencyMap.put(currentWord,frequency + 1); 

    } 
    ArrayList map; 
    map = sortByValue(frequencyMap); 

    for(int i= 0; i < 20; i++) 
     System.out.println(map.get(i)); 

    } 

// Sort a map with its values in ascending order 
public static ArrayList < Map . Entry > sortByValue (Map map) 
{ 
ArrayList < Map . Entry > a = new ArrayList (map . entrySet()); 
// sort by providing my own comparator 
Collections . sort (a , new Comparator() 
{ 
public int compare (Object o1 , Object o2) 
{ 
Map . Entry e1 = (Map . Entry) o1 ; 
Map . Entry e2 = (Map . Entry) o2 ; 
return ((Comparable) e1 . getValue()). compareTo (e2 . getValue()) ; 
} 
}) ; 
return a; 
} 


} 

IOException異常是

Exception in thread "main" java.lang.NullPointerException 
at java.util.StringTokenizer.<init>(Unknown Source) 
at java.util.StringTokenizer.<init>(Unknown Source) 
at WordFrequency.main(WordFrequency.java:20) 

回答

1

看看while ((currentLine = in.readLine()) != null) {

當這個循環退出時,currrentLinenull,這是循環的要求。

你應該考慮什麼做的是移動您使用的是讀取文件的while環內的currentLine的處理...

例如...

while ((currentLine = in.readLine()) != null) { 
    currentLine = currentLine.toLowerCase(); 
    StringTokenizer tokenizer = new StringTokenizer(currentLine, " \t\n\r\f.,;:!?'"); 

    while (tokenizer.hasMoreTokens()) { 
     final String currentWord = tokenizer.nextToken(); 
     Integer frequency = frequencyMap.get(currentWord); 
     if (frequency == null) { 
      frequency = 0; 
     } 
     frequencyMap.put(currentWord,frequency + 1); 
    } 

} 
+0

這擺脫了異常,但由於某種原因,現在它不輸出任何東西。有任何想法嗎? – csanders8

+0

似乎工作對我來說很好。在完成讀取文件後,您是否嘗試輸出'frequencyMap'的大小 – MadProgrammer

+0

部分任務是打印20個最頻繁且最不頻繁的單詞。我嘗試使用每個循環的a,但是存在從Map.Entry到Object的類型不匹配。爲什麼這不起作用? – csanders8

0

的問題是在這裏:

while ((currentLine = in.readLine()) != null) { 
    currentLine = currentLine.toLowerCase(); 
} 

你基本上只是通過文件,直到結束。然後將null保存在currentLine中,並用null ---> NullPointerException調用Tokenizer。

添加一個新的變量:

String text = ""; 
while ((currentLine = in.readLine()) != null) { 
    text += currentLine.toLowerCase(); 
} 

然後使用text的分詞器。

+0

這擺脫了異常,但由於某種原因,現在它不輸出任何東西。有任何想法嗎? – csanders8

0

只需添加另一個字符串即可在currentLine變爲空之前添加。見下面的entireText

package org.fuzzyanalysis.demo; 


import java.util.*; 
import java.io.*; 

public class WordFrequency { 

    public static void main(String []args) throws IOException { 

     File textFile = new File("book.txt"); 
     BufferedReader in = new BufferedReader(new FileReader(textFile)); 
     TreeMap<String, Integer> frequencyMap = new TreeMap<String, Integer>(); 
     String currentLine; 
     String entireText = ""; 
     while ((currentLine = in.readLine()) != null) { 

      currentLine = currentLine.toLowerCase();    
      entireText += currentLine; 

     } 

     StringTokenizer tokenizer = new StringTokenizer(entireText, " \t\n\r\f.,;:!?'"); 

     while (tokenizer.hasMoreTokens()) { 
      final String currentWord = tokenizer.nextToken(); Integer frequency = frequencyMap.get(currentWord); 
      if (frequency == null) { frequency = 0; } frequencyMap.put(currentWord,frequency + 1); 

     } 
     ArrayList map; 
     map = sortByValue(frequencyMap); 

     for(int i= 0; i < 20; i++) 
      System.out.println(map.get(i)); 

     } 

    // Sort a map with its values in ascending order 
    public static ArrayList < Map . Entry > sortByValue (Map map) 
    { 
     ArrayList < Map . Entry > a = new ArrayList (map . entrySet()); 
     // sort by providing my own comparator 
     Collections . sort (a , new Comparator() 
     { 
      public int compare (Object o1 , Object o2) 
      { 
       Map . Entry e1 = (Map . Entry) o1 ; 
       Map . Entry e2 = (Map . Entry) o2 ; 
       return ((Comparable) e1 . getValue()). compareTo (e2 . getValue()) ; 
      } 
     }) ; 
    return a; 
    } 


} 
+0

這擺脫了異常,但由於某種原因,現在它不輸出任何東西。有任何想法嗎? – csanders8

+0

確保在項目所在的同一目錄中使用名爲「book.txt」的文件,然後在其中放入一些文字。當使用「book.txt」作爲包含單詞「this is a book ahha」的文件時,我得到以下輸出:a = 1 ahha = 1 book = 1 is = 1 this = 1 – fuzzyanalysis