java编码在文件中查找20个常用单词

时间:2014-06-23 12:40:06

标签: java

我写这段代码,找到我读过的文件中经常使用的前20个单词     但是在第51行和第20行中我得到的错误是零点异常     我无法找到它     我需要什么改变 制作     我根据命令行参数读取文件 还为我提供了一些补充条件的帮助 提前谢谢。

import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Scanner;
import java.util.StringTokenizer;


public class WordFrequency {
    private static final Hashtable<String, Integer> Null = null;    

    public static void main(String[] args) throws IOException {
        System.out.println("in to the main");
        WordFrequency test = new WordFrequency();
        test.countWordFre(args); // for accessing the countWordFre method
    }

    // countWordFre method      
    public void countWordFre(String[] fileNames) throws IOException {

        int i;

        Scanner fileReader = null;

        Hashtable<String, Integer> map = new Hashtable<String, Integer>();

        System.out.println("reading files");

        System.out.println("enter how many number of files to read");
        System.out.println(" enter the filename");

        // as command line arguments

        for ( i = 0 ; i < fileNames.length ; i++ ) {

            fileReader = new Scanner(new FileInputStream(fileNames [i]));
        }


        while (fileReader.hasNextLine()) {

            String line = fileReader.nextLine();

            String word;
            // to read each tokens of a line

            StringTokenizer st = new StringTokenizer(line);


            while (st.hasMoreTokens()) {

                word = st.nextToken().toLowerCase();

                System.out.println("converting the words to lower case");   


                if (map.containsKey(word)) {

                    int count = (Integer) map.get(word);

                    map.put(word, count + 1);

                } else {

                    map.put(word, 1);

                }

            }

        }

        Enumeration<String> e = map.keys();

        while (e.hasMoreElements()) {

            String word = e.nextElement();

            System.out.println(word + " " + map.get(word));
        } 
    }
   // System.out.println(map.size());




    public void List() throws IOException

    {

        System.out.println("to find 20 frq word");


        Hashtable<String, Integer> map = Null;



        List<String> mapKeys = new ArrayList<String>();

        List<Integer> mapValues = new ArrayList<Integer>(map.values());  


        Collections.sort(mapValues);
        Collections.reverse(mapValues); //descending order sort
        Collections.sort(mapKeys);
        Collections.reverse(mapValues);

        LinkedHashMap<String, Integer> sortedMap = new LinkedHashMap<String, Integer>(); 

        Iterator<Integer> valueIt = mapValues.iterator();

        while (valueIt.hasNext()) {

            Object val = valueIt.next();


            Iterator<String> keyIt = mapKeys.iterator();

            while (keyIt.hasNext()) {

               Object key = keyIt.next();

               String valueFromOriginalMap = map.get(key).toString();

               String valueFromCurrentIteration = val.toString();

               if (valueFromOriginalMap .equals(valueFromCurrentIteration )) {                                                 

                    map.remove(key);                                                    
                    mapKeys.remove(key);                                             
                    sortedMap.put((String)key , (Integer)val);

                    break;
               }       


           }

     }

  }

}

3 个答案:

答案 0 :(得分:0)

可能是因为你没有正确地将参数传递给你的程序,我得到了没有args的相同错误。使用正确的args可以正常运行。

确保在cmd中正确传递参数

java WordFrequency "Hello.txt"

答案 1 :(得分:0)

首先编写一个更小更简单的程序1)从控制台读入文件名。 2)将该文件作为文本打开。 3)在屏幕上显示文件的前20个单词。

彻底测试较小的程序以确保它有效。例如,如果输入文件名时出错,它会怎么做?说,“myfile。 ttx ”而不是“myfile.txt”

当您使用较小的程序时,将其展开以计算单个文件中最常用的20个单词。再次测试并解决任何问题。然后才尝试编写最终程序来计算多个文件中的单词。

让第一个小程序工作应该会告诉你当前程序失败的地方,但是因为程序较小所以会更容易看到。

答案 2 :(得分:0)

您的代码

    for ( i = 0 ; i < fileNames.length ; i++ ) {
        fileReader = new Scanner(new FileInputStream(fileNames [i]));
    }
    while (fileReader.hasNextLine()) {

只会处理带有覆盖变量fileReader的最后一个文件。

一般来说,如果声明接近其使用,声明首次使用,则付费。

检查输入,比如打印处理的文件也可能有帮助。

NullPointerException可能会以正确的结构和检查的输入数据消失。

你可能会这样做:

            Integer freq = map.get(word);
            int count = freq == null ? 0 : freq;
            map.put(word, count + 1);