求一个方法。该方法读取一个.txt文件并计数每个单词出现的次数,不区分大小写。各种标号和数字除外。注意效率!
例如:txt文件的内容是:I like Java./?? I've study [ java for 1 year.
输出:i 2
like 1
java 2
ve 1
for 1
year 1
------解决方案--------------------
用下面的代码,应该可以实现你想要的把每个单词个数都统计出来:
import java.util.*;
import java.util.regex.*;
import java.io.*;
public class UserTreeMap{
public static void main(String args[]) throws IOException{
BufferedReader buf=new BufferedReader(new FileReader("english.txt"));
System.out.println("Read under this dir English.txt");
StringBuffer sbuf=new StringBuffer();//缓冲字符串
String line=null;
while((line=buf.readLine())!=null){
sbuf.append(line);//追加到缓冲字符串中
}
buf.close();//读取结束
Pattern expression=Pattern.compile("[a-zA-Z]+");//定义正则表达式匹配单词
String string1=sbuf.toString().toLowerCase();//转换成小写
Matcher matcher=expression.matcher(string1);定义string1的匹配器
TreeMap myTreeMap=new TreeMap();//创建树映射 存放键/值对
int n=0;//文章中单词总数
Object word=null;//文章中的单词
Object num=null;//出现的次数
while(matcher.find()){//是否匹配单词
word=matcher.group();//得到一个单词-树映射的键
n++;//单词数加1
if(myTreeMap.containsKey(word)){//如果包含该键,单词出现过
num=myTreeMap.get(word);//得到单词出现的次数
Integer count=(Integer)num;//强制转化
myTreeMap.put(word,new Integer(count.intValue()+1));
}
else
{
myTreeMap.put(word,new Integer(1));//否则单词第一次出现,添加到映射中
}
}
System.out.println("统计分析如下:");
System.out.println(""t 文章中单词总数"+n+"个");
System.out.println("具体的信息在当前目录的result.txt文件中");
BufferedWriter bufw=new BufferedWriter(new FileWriter("result.txt"));
Iterator iter=myTreeMap.keySet().iterator();//得到树映射键集合的迭代器
Object key=null;
while(iter.hasNext()){//使用迭代器遍历树映射的键
key=iter.next();
bufw.write((String)key+":"+myTreeMap.get(key));//键/值写到文件中
bufw.newLine();
}
bufw.write("english.txt中的单词总数"+n+"个");
bufw.newLine();
bufw.write("english.txt中不同单词"+myTreeMap.size()+"个");
bufw.close();
}
}
------解决方案--------------------
晕 上面的没格式化
- Java code
package csdn;import java.io.*;import java.util.*;public class CountWords { public static void main(String[] a) { InnerCountWords icw = new InnerCountWords("words.txt"); Map<String,Integer> result = icw.getResult(); //开始统计 System.out.println(result); }}class InnerCountWords { private String fileName; public InnerCountWords(String fileName) { this.fileName = fileName; } public Map<String,Integer> getResult() { Map<String,Integer> result = new HashMap<String,Integer>(); FileInputStream fis = null; try { fis = new FileInputStream(fileName); //打开文件 int in = 0; //读入的字符 StringBuffer sb = new StringBuffer(); //缓存单词 in = fis.read(); //读入 boolean notEnd = true; //是否是文件尾 while(notEnd) { if(-1 == in) { notEnd = false; //如果到文件尾,结束while } if(Character.isLetter((char)in)) { sb.append((char)in); //判断读入的是否是字母,如果是,就追加到StringBuffer } else { //否则就判断StringBuffer里面是否有单词存在,如果有就加入到Map中 if(sb.length() > 0) { if(result.containsKey(sb.toString())) { result.put(sb.toString(), result.get(sb.toString()) + 1); } else { result.put(sb.toString(),1); } } sb = new StringBuffer(); //重新设置StringBuffer } in = fis.read(); //读入字符 } return result; } catch (IOException e) { e.printStackTrace(); } finally { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } return null; }}