求一个方法。该方法读取一个.txt文件并计数每个单词出现的次数,不区分大小写。各种标号和数字除外。注意效率!
例如:txt文件的内容是:I like Java./?? I've study [ java for 1 year.
输出:i 2
like 1
java 2
ve 1
for 1
year 1
例如:txt文件的内容是:I like Java./?? I've study [ java for 1 year.
输出:i 2
like 1
java 2
ve 1
for 1
year 1
再去处理数组就好办多了.
directory<string ,int>
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();
}
}
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;
}
}
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;
}
}
public class Test{
public static void main(String[] args){
System.out.println(pattern("adsf ;lka lka jkjava,ajava,ajava,javajavajava"));
} /**
* Map里放的是:key--单词;value出现的次数
* @param source
* @return
*/
public static Map<String,Integer> pattern(String source){
Map<String,Integer> map=new HashMap<String,Integer>();
Pattern p=Pattern.compile("\\w+",Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(source);
while(m.find()){
String tem=m.group(0);
if(map.containsKey(tem)){
int i=map.get(tem)+1;
map.put(tem, i);
}else{
map.put(tem, 1);
}
}
return map;
}
}
用
Pattern p=Pattern.compile("[A-Z]+",Pattern.CASE_INSENSITIVE);
替换:
Pattern p=Pattern.compile("\\w+",Pattern.CASE_INSENSITIVE);
这样就不会出现统计数字了,要不上面那个了会出现如: 2=1,也就是数字2出现的次数
用:
String tem=m.group(0).toLowerCase();
替换:
String tem=m.group(0);
这样就不区分大小写了
public static void main(String[] args){
System.out.println(pattern("I like Java./?? I've study [ java for 1 year."));
}
/**
* Map里放的是:key--单词;value出现的次数
* @param source
* @return
*/
public static Map<String,Integer> pattern(String source){
Map<String,Integer> map=new HashMap<String,Integer>();
Pattern p=Pattern.compile("[A-Z]+",Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(source);
while(m.find()){
String tem=m.group(0).toLowerCase();
if(map.containsKey(tem)){
int i=map.get(tem)+1;
map.put(tem, i);
}else{
map.put(tem, 1);
}
}
return map;
}
}
和你要的一样了
package com.sytdc.cxl;import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;public class AnalysiCount { public static void main(String[] args) { String str = "帅哥,美女,帅哥,野兽,美女,帅哥";
String str2 = " this is a book, he is name is lilei. ";
str2 = str2.replaceAll(",", "");
str2 = str2.replaceAll("\\.", "");
str2 = str2.trim();
str2 = str2.replaceAll(" ", ",");
System.out.println(str2);
Map hp = getCountMap(str2);
//Map hp = getCountMap(str);
Set st = hp.keySet();
Iterator ite = st.iterator(); while (ite.hasNext()) {
String key = (String) ite.next();
int value = (Integer) hp.get(key);
System.out.println("" + key + ": " + value);
} } public static Map getCountMap(String str) {
// 求一个字符串中每个单词出现的次数
Map hsp = new HashMap(); String sarray[] = str.split(",");
for (int i = 0; i < sarray.length; i++) {
String key = sarray[i];
if (hsp.containsKey(key)) {
int value = (Integer) hsp.get(key);
hsp.put(key, ++value);
} else {
hsp.put(key, 1);
} } return hsp;
}}运行结果:this,is,a,book,he,is,name,is,lilei
is: 3
name: 1
a: 1
book: 1
he: 1
lilei: 1
this: 1
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Scanner;public class WordCount { public static void main(String[] args) {
Map<String, Integer> map = new LinkedHashMap<String, Integer>();
Scanner scanner = null;
try {
scanner = new Scanner(new File("words.txt")).useDelimiter("[^a-zA-Z]+");
while (scanner.hasNext()) {
String str = scanner.next();
countWord(map, str.toLowerCase());
}
} catch(IOException e) {
e.printStackTrace();
} finally {
scanner.close();
}
// print result
for(Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + " --> " + entry.getValue());
}
}
private static void countWord(Map<String, Integer> map, String str) {
if(!map.containsKey(str)) {
map.put(str, 1);
return;
}
map.put(str, map.get(str) + 1);
}
}