1

我正在用 Java 编写一个简单的二元组频率计数算法,遇到一个我不知道如何解决的问题。

我的源文件是一个 9MB 的 .txt 文件,其中包含随机单词,以空格分隔。

当我运行将输入限制为前 100 行的脚本时,我得到的二元组“嘿那里”的频率值为 1。

但是,当我取消仅扫描前 100 行并扫描整个文件的限制时,对于同一个二元组搜索,我得到一个 null 值。HashMap 中的键/值对现在为空。

我将所有二元组存储在 HashMap 中,并使用 BufferedReader 读取文本文件。

是什么导致二元组(键)从 HashMap 中删除或覆盖?如果我正在阅读整个文件或只是它的第一部分,这无关紧要。

public class WordCount {

public static ArrayList<String> words = new ArrayList<String>();
public static Map<String, Integer> bi_count = new HashMap<String, Integer>();

public static void main(String[] args) {

    BufferedReader br = null;

    try {

        String sCurrentLine;

        br = new BufferedReader(new FileReader(args[0]));
        System.out.println("\nProcessing file..."); 

        while (br.readLine() != null) {
    //  for (int i = 0; i < 53; i++ ) {
            sCurrentLine = br.readLine();
            if (sCurrentLine != null) {
                String[] input_words = sCurrentLine.split("\\s+");
                for (int j = 0; j < input_words.length; j++) {
                    words.add(input_words[j]); 
                }
            }
        }
    } 
    catch (IOException e) {
        e.printStackTrace();
    } 
    finally {
        try {
            if (br != null)br.close();
            countWords(); 
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

}

private static void countWords() {

    for (int k = 0; k < words.size(); k++) {
        String word = words.get(k);
        String next = ""; 
        if (k != words.size() - 1) {
            next = words.get(k+1);
        }

        String two_word = word + " " + next; 

        if (bi_count.containsKey(two_word)) {
            int current_count = bi_count.get(two_word); 
            bi_count.put (two_word, current_count + 1); 
        }
        else {
            bi_count.put( two_word, 1); 
        }

    }

    System.out.println("File processed successfully.\n");
}
4

2 回答 2

4

我不完全相信这是你的问题的原因,你没有阅读输入文件的所有行。

while (br.readLine() != null) {
        sCurrentLine = br.readLine();

if() 语句中读取的行根本没有被处理 - 您缺少备用行。

而是试试这个:

while ((sCurrentline = nr.readLine()) != null) {
   //now use sCurrentLine...
}
于 2013-10-19T20:57:37.250 回答
1

这段代码是错误的,因为 readline 被调用了两次:

    while (br.readLine() != null) {
//  for (int i = 0; i < 53; i++ ) {
        sCurrentLine = br.readLine();
        if (sCurrentLine != null) {
            String[] input_words = sCurrentLine.split("\\s+");
            for (int j = 0; j < input_words.length; j++) {
                words.add(input_words[j]); 
            }
        }
    }

我会建议:

    while ((sCurrentline = nr.readLine()) != null)  {
        String[] input_words = sCurrentLine.split("\\s+");
        for (int j = 0; j < input_words.length; j++) {
                words.add(input_words[j]); 
        }
    } 
于 2013-10-19T20:53:38.743 回答