Java 如何使文件读取器不出现异常?
任务是读取文件中的每个单词,并使用地图计算每个单词的频率。然后使用给定的方法sortByValue(Map)组织它们。我对如何正确读取文件并为字符串键分配整数值感到困惑。帮忙Java 如何使文件读取器不出现异常?,java,arraylist,maps,bufferedreader,ioexception,Java,Arraylist,Maps,Bufferedreader,Ioexception,任务是读取文件中的每个单词,并使用地图计算每个单词的频率。然后使用给定的方法sortByValue(Map)组织它们。我对如何正确读取文件并为字符串键分配整数值感到困惑。帮忙 import java.util.*; import java.io.*; public class WordFrequency { public static void main(String []args) throws IOException { File textFile = new F
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;
}
}
import java.util.*;
导入java.io.*;
公共类词频{
公共静态void main(字符串[]args)引发IOException{
File textFile=新文件(“book.txt”);
BufferedReader in=new BufferedReader(new FileReader(textFile));
TreeMap frequencyMap=新的TreeMap();
串电流线;
而((currentLine=in.readLine())!=null){
currentLine=currentLine.toLowerCase();
}
StringTokenizer tokenizer=新的StringTokenizer(当前行“\t\n\r\f.;:!?”;
while(tokenizer.hasMoreTokens()){
最后一个字符串currentWord=tokenizer.nextToken();整数频率=frequencyMap.get(currentWord);
如果(frequency==null){frequency=0;}frequencycmap.put(currentWord,frequency+1);
}
阵列列表图;
map=排序值(frequencyMap);
对于(int i=0;i<20;i++)
System.out.println(map.get(i));
}
//按升序对地图及其值进行排序
公共静态ArrayListsortByValue(映射)
{
ArrayLista=新的ArrayList(Map.entrySet());
//通过提供我自己的比较器进行排序
Collections.sort(一个新的比较器()
{
公共整数比较(对象o1、对象o2)
{
Map.Entry e1=(Map.Entry)o1;
Map.Entry e2=(Map.Entry)o2;
return((compariable)e1.getValue()).comparieto(e2.getValue());
}
}) ;
返回a;
}
}
例外情况是
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)
线程“main”java.lang.NullPointerException中的异常
位于java.util.StringTokenizer。(未知源)
位于java.util.StringTokenizer。(未知源)
位于WordFrequency.main(WordFrequency.java:20)
查看while((currentLine=in.readLine())!=null){
当此循环退出时,currentline
将null
,这是循环的要求
您应该考虑的是在<代码>中移动<代码> CurrrayLoe<代码>,同时使用Road读取文件…
例如
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);
}
}
问题在于:
while ((currentLine = in.readLine()) != null) {
currentLine = currentLine.toLowerCase();
}
基本上只需遍历文件直到结束。然后null保存在currentLine中,并使用null-->NullPointerException调用标记器
添加新变量:
String text = "";
while ((currentLine = in.readLine()) != null) {
text += currentLine.toLowerCase();
}
然后对标记器使用text
。只需添加另一个字符串,在其变为null之前获取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;
}
}
package org.fuzzyananalysis.demo;
导入java.util.*;
导入java.io.*;
公共类词频{
公共静态void main(字符串[]args)引发IOException{
File textFile=新文件(“book.txt”);
BufferedReader in=new BufferedReader(new FileReader(textFile));
TreeMap frequencyMap=新的TreeMap();
串电流线;
字符串entireText=“”;
而((currentLine=in.readLine())!=null){
currentLine=currentLine.toLowerCase();
entireText+=当前行;
}
StringTokenizer tokenizer=新的StringTokenizer(entireText,“\t\n\r\f,;:!?”;
while(tokenizer.hasMoreTokens()){
最后一个字符串currentWord=tokenizer.nextToken();整数频率=frequencyMap.get(currentWord);
如果(frequency==null){frequency=0;}frequencycmap.put(currentWord,frequency+1);
}
阵列列表图;
map=排序值(frequencyMap);
对于(int i=0;i<20;i++)
System.out.println(map.get(i));
}
//按升序对地图及其值进行排序
公共静态ArrayListsortByValue(映射)
{
ArrayLista=新的ArrayList(Map.entrySet());
//通过提供我自己的比较器进行排序
Collections.sort(一个新的比较器()
{
公共整数比较(对象o1、对象o2)
{
Map.Entry e1=(Map.Entry)o1;
Map.Entry e2=(Map.Entry)o2;
return((compariable)e1.getValue()).comparieto(e2.getValue());
}
}) ;
返回a;
}
}
排除了异常,但由于某些原因,现在它没有输出任何内容。有什么想法吗?对我来说似乎很好。您是否尝试过在读完文件后输出频率贴图的大小。作业的一部分是打印20个最频繁和最不频繁的单词。我尝试过对每个单词使用a循环,但Map.Entry到Object的类型不匹配。为什么不起作用?您可以尝试将ArrayList Map;
更改为ArrayList Map;
抱歉,代码确实输出了它,只是花了一段时间。但是当使用指定的分隔符读取文件时,它有时会将两个单词链接在一起,并且不允许我分隔引号marks.有没有办法解决这个问题?(该文件是一本福尔摩斯的书,因此代码编译需要一段时间)它消除了异常,但由于某种原因,现在它没有输出任何东西。有什么想法吗?请确保使用名为“book.txt”的文件将“book.txt”用作包含单词“this is a book ahha”的文件时,我得到了以下输出:a=1 ahha=1 book=1 is=1 this=1它消除了异常,但出于某种原因,现在它什么也不输出。有什么想法吗?