使用Scanner存储文件中单词的出现次数及其计数。(Java)

时间:2012-03-14 17:28:37

标签: java java.util.scanner

以下是代码:

        Scanner scan = new Scanner(new FileReader ("C:\\mytext.txt"));
        HashMap<String, Integer> listOfWords = new HashMap<String, Integer>();

        while(scan.hasNextLine())
        {
            Scanner innerScan = new Scanner(scan.nextLine());
            boolean wordExistence ;
            while(wordExistence = innerScan.hasNext())
            {
                String word = innerScan.next(); 
                int countWord = 0;
                if(!listOfWords.containsKey(word)){ already
                    listOfWords.put(word, 1); 
                }else{
                    countWord = listOfWords.get(word) + 1; 
                    listOfWords.remove(word);
                    listOfWords.put(word, countWord); 
                }
            }
        }

        System.out.println(listOfWords.toString());

问题是,我的输出包含如下字样:

document.Because=1 document.This=1 space.=1

我如何处理正在发生的这个句号?(对于更多问题,我认为任何句子终结符都是问题,如问号或感叹号)。

4 个答案:

答案 0 :(得分:2)

查看Scanner API的课堂笔记,特别是关于使用除空格以外的分隔符的段落。

答案 1 :(得分:2)

Scanner使用任何空格作为默认分隔符。您可以调用Scanner实例的useDelimiter()并指定自己的正则表达式作为分隔符。

答案 2 :(得分:1)

如果您希望不仅使用空格分隔符,还需要使用.和问号/感叹号来分割输入,则必须定义Pattern,然后将其应用于扫描仪useDelimiterdoc)。

答案 3 :(得分:1)

也许你想修补以下速度优化的答案。

    final Pattern WORD = Pattern.compile("\\w+");
    while(scan.hasNextLine())
    {
        Scanner innerScan = new Scanner(scan.nextLine());
        while(innerScan.hasNext(WORD))
        {
            String word = innerScan.next(WORD); 
            if(!listOfWords.containsKey(word)){
                listOfWords.put(word, 1); 
            }else{
                int countWord = listOfWords.get(word) + 1; 
                //listOfWords.remove(word);
                listOfWords.put(word, countWord); 
            }
        }
    }