我写这段代码,找到我读过的文件中经常使用的前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;
}
}
}
}
}
答案 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);