求一个方法。该方法读取一个.txt文件并计数每个单词出现的次数,不区分大小写。各种标号和数字除外。注意效率!
例如:txt文件的内容是:I like Java./?? I've study [ java for 1 year.
输出:i    2
     like 1
     java 2
     ve   1
     for  1
     year 1

解决方案 »

  1.   

    把文件里的字符全存放到一个char[]数组里.
    再去处理数组就好办多了.
      

  2.   

    首先分词,存入一个数组,然后循环数组统计个数,用字典来存放,key是单词,value是个人
    directory<string ,int>
      

  3.   

    用下面的代码,应该可以实现你想要的把每个单词个数都统计出来:
    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();
    }
      

  4.   

    刚写的一个,没详细测试,楼主可以看看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;
    }
    }
      

  5.   

    晕 上面的没格式化
    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;
    }
    }
      

  6.   

    哪有那么麻烦啊:
    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;
    }
    }
      

  7.   

    再改一下,

    Pattern p=Pattern.compile("[A-Z]+",Pattern.CASE_INSENSITIVE);
    替换:
    Pattern p=Pattern.compile("\\w+",Pattern.CASE_INSENSITIVE); 
    这样就不会出现统计数字了,要不上面那个了会出现如: 2=1,也就是数字2出现的次数
      

  8.   

    Sorry还要改一下,
    用:
    String tem=m.group(0).toLowerCase();
    替换:
    String tem=m.group(0); 
    这样就不区分大小写了
      

  9.   

    public class Test{
    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;
    }
    }
    和你要的一样了
      

  10.   

    我的代码以前写的,看下,测试通过没问题的:
    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
      

  11.   

    import java.io.File;
    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);
        }
    }