您的位置:首页 > 其它

作业三

2016-03-16 21:28 239 查看
我大一的时候做过这个题目,当时我用的是c++。我那个时候的想法比较朴素,算法也比较烦索,具体想法是这样的:我先把要统计的文本f1以空格分界一个个单词的读入,在读入的时候把大写全变小写,特殊字符消去,存入全新的文本f2。然后复制f2到新的f3。把f3与f2比较去掉f3中重复单词,即将所有相同的单词只保留一个,变成一个全新的f3文件。最后将f3中的单词一个个拿出来与f2的比较,统计出每个单词出现的次数。

现在用java做的时候,我就不想用这种方法了,然后上网找思路的时候,看到了一种方法,就是用java中的map接口。map可以避免很多上述文本复制的麻烦,但是去掉无用字符的时候费了一点时间,最后我是先按行读取字符串,然后以空格切割成单个字符串,然后再把单个字符串分割成一个个的单个字符的字符串,然后用个if语句去掉无用字符,再连接起来,全体变小写,放入字符串数组中。最后用map接口,只保留一个单词,和出现的字数。最后用一个if语句把字符串长度大于3的输出

package 统计单词个数;
import java.io.*;
import java.util.*;

public class 统计单词 {
public static void main(String[] args)
{
try{
FileReader fr1=new FileReader("单词文本2.txt");   //读取文本
BufferedReader bf1=new BufferedReader(fr1);
String str1 = null;String [] str=null;String [] str2=null;
while((str1=bf1.readLine())!=null)            //按行读取
{
str=str1.split(" ");                      //按空格切分字符串
for(int i=0;i<str.length;i++)
{
str2=str[i].split("");                //把一个字符串分为一个一个的字符,主要目的是为了好把字母以外的符号去掉
String a=null;
for(int j=0;j<str2.length;j++)
{
if(str2[j].charAt(0)>='A'&&str2[j].charAt(0)<='Z'||str2[j].charAt(0)>='a'&&str2[j].charAt(0)<='z')
{
str2[j]=str2[j].toLowerCase();  //大写变小写
if(a==null)
a=str2[j];
else
a=a+str2[j];                //一个完整的只有字母的字符串即完整的单词
}
}
str[i]=a;
}
}
fr1.close(); bf1.close();
Map<String,Integer> map = new HashMap<String,Integer>(); //map接口统计字母出现频率
for (int j = 0; j < str.length; j++)
{
Integer count = map.get(str[j]);       //一个单词出现的次数
if(count==null)                        //如果没有出现过,置一次
{
map.put(str[j],1);
}
else                                  //如果以前出现过,那么次数加一
{
map.put(str[j],++count);
}
}
String [] str3=null;
for(Map.Entry<String,Integer> entry : map.entrySet())
{
if(entry.getKey()!=null)
str3=entry.getKey().split("");
if( str3!=null&&str3.length>3)                     //str3可能为空,且这个控制只有含有3个字母以上的单词才打印
System.out.println(entry.getKey() +": "+"\t"+ entry.getValue());
}
}catch(Exception e){
e.printStackTrace();}
}
}


最后运行结果:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: