问题说明:
这是自己尝试写的字频统计的代码,但是调试时没有输出,于是在代码中间插入了很多输出语句,发现程序无法进入for循环体,程序中所有的for循环体都直接被跳过了。
代码如下:
import java.io.*;
import java.util.*;
public class Counter {
public static String txt2String(File file){
StringBuilder result = new StringBuilder();
try{
BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件
String s = null;
while((s = br.readLine())!=null){ //使用readLine方法,一次读一行
result.append(System.lineSeparator()+s);
}
br.close();
}catch(Exception e){
e.printStackTrace();
}
return result.toString();
}
public static void count(String str) {
String[] strarray = str.split("\b");
ArrayList<String> list = new ArrayList<String>();
ArrayList<Integer> num = new ArrayList<Integer>();
int temp = 1;
System.out.println("list和num初始化完成。");
System.out.println("开始剔除重复并计数。");
for(int i = 0; i<list.size(); i++) {
System.out.println("进入循环体。");
int flag = 0;
for(int j = 0; j<i; j++) {
if(strarray[j].equals(strarray[i])) {
flag = flag+1;
for(int m =0; m<list.size(); m++) {
if(strarray[m].equals(strarray[j])) {
temp++;
num.add(j,temp);
}
}
System.out.println("遇到重复单词。");
break;
}
else {
System.out.println("这次没遇到重复单词。");
}
}
if(flag==0) {
list.add(i,strarray[i]);
System.out.println("成功添加一个新单词。");
}
}
System.out.println("准备输出最终统计结果。");
for(int i =0; i<list.size(); i++) {
System.out.print(list.get(i));
System.out.print(":出现了");
System.out.print(num.get(i));
System.out.println("次");
}
}
public static void main(String[] args) {
File file = new File("D:\\java eclipse\\eclipse-workspace\\Counter\\src\\news.txt");
String str = new String(txt2String(file));
count(str);
}
}
控制台输出结果如下:
纠错尝试:
查了ArrayList遍历和add的用法,感觉应该没错。(但是我是新手 第一次用ArrayList也不是很确定,不清楚是不是和这个有关)
搜索了无法进入for循环的情况,没找到什么有价值的信息。
PS:
希望能有人帮忙解答我的问题或者可以提供字频统计程序的源码参考,谢谢!
后来自己又重新查了一下资料,重新写了一下。
用map来存储单词和频数显然更加合理一些,用Comparator来做升降序排列。
这是老师给的一道实验题,发一下题目吧,和我一样的初学者有兴趣也可以写着试一试。
题目如下:
我把后来写的代码重新发一下。
代码如下:
运行结果如下:
如有错误,敬请指正。