统计单词,字母的次数和频率

一:统计所给出文件中英文字母出现的频率(区分大小写),并且按着出现频率倒序输出

思路: 1、将文件内容存入StringBuffer中;

            2、将读入的内容进行分割;

            3、遍历数组,将其放入一个TreeMap <String,Integer>中;

            4、对其计算出来的频率进行排序;

package file;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.math.BigInteger;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.TreeMap;
import java.util.TreeSet;
public class zimupaixu
{
    public static void main(String [] args) throws IOException {
        //读取文件
        BufferedReader br=new BufferedReader(new FileReader("F:\\\\备用\\\\english.txt"));        
        TreeMap<Character,Integer> tm=new TreeMap<>();//打开哈希表
        int  key;
        while((key=br.read())!=-1) {    
             if((key>='A'&&key<='Z')||(key>'a'&&key<='z')) {
                 tm.put((char)key,tm.containsKey((char)key)?tm.get((char)key)+1:1);//累计不同字母出现的次数
            }
            
            }    
        br.close();
        int max=0;
        int sum=0;
        int t=0;
        for(Character k: tm.keySet()) {
            sum=sum+tm.get(k);
          }
        TreeSet<Character> ts=new TreeSet<>(new Comparator<Character>()
        {
            public int compare(Character a,Character b) {
                int num=tm.get(a)-tm.get(b);
                return num==0?1:(-num);
            }
        });
        for(Character k: tm.keySet()) {
            ts.add(k);
        }
        DecimalFormat df = new DecimalFormat("0.00%");
        for (Character c : ts)
        {
            float bai=(float)tm.get(c)/sum;
           
            System.out.println(c+" "+"出现的百分比"+" "+df.format(bai));
        }
          
        
        
        //System.out.println(sum);
}}

二、输出单个文件的前N个最常出现的英文单词

思路:1、从头到尾遍历文件,从文件中读取遍历到的每一个单词。

           2、把遍历到的单词放到TreeHasp中,并统计这个单词出现的次数。

           3、定义全局变量N控制输出多少个单词

           4、循环对全部单词次数进行比较获取出现次数最多的那个,循环N次。

package file;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;
public class danci {
    class Word//定义单词类
    {
        String value;//具体的单词
        int count;//出现的个数
        Word next;//将单词链起来
        public Word(String value,int geshu)//带参构造函数
        {
            this.value=value;
            this.count=geshu;
            next=null;
        }
        public Word()//构造函数
        {
            this.value="";
            this.count=0;
            next=null;
        }
    }    
    /*
     * 读取指定路径下的文件名和目录名
     */
    public void getFileList() throws IOException {
        BufferedReader br=new BufferedReader(new FileReader("F:\\备用\\english.txt"));        
        TreeMap<Character,Integer> hm=new TreeMap<>();
        int  key;
        while((key=br.read())!=-1) {    
                    Word word=new Word(); //单词的链头
                    Word lian,xin;                                             
                    String str="";
                    char[] c=new char[1];//每次读取一个字母
                    int b=0;
                    boolean exist=false;//判断单词是否存在于  word 链中
                    while((b=br.read(c))!=-1)//读取字母
                    {
                        //分割
                        if(String.valueOf(c).equals("\r")||String.valueOf(c).equals("\n")||String.valueOf(c).equals(" ")||String.valueOf(c).equals(",")||String.valueOf(c).equals(".")||String.valueOf(c).equals("\"")||String.valueOf(c).equals("'"))
                        {
                            lian=word;
                            while(lian!=null)            
                            {
                                if(lian.value.equalsIgnoreCase(str))//累计不同单词的个数
                                {
                                    lian.count++;exist=true;
                                    break;
                                }
                                else
                                {
                                    lian=lian.next;
                                }
                            }
                            if(exist==false)//如果不存在,则在单词链中添加
                            {
                                xin=new Word(str,1);
                                xin.next=word.next;
                                word.next=xin;
                                str="";
                            }
                            else
                            {
                                exist=false;
                                str="";
                            }
                        }
                        else 
                        {
                            str+=String.valueOf(c);
                        }
                    }
                    System.out.print("前N个最长出现的单词的数量:");
                    Scanner scan=new Scanner(System.in);
                    int N=scan.nextInt();
                    System.out.println("");
                    for(int i=1;i<=N;i++)                   
                    {//根据输入的N输出相应的单词以及其个数
                        xin=new Word("",0);
                        lian=word.next;
                        while(lian!=null)
                        {
                            if(lian.count>xin.count)
                            {
                                xin=lian;
                            }
                            lian=lian.next;
                        }
                        System.out.println(+i+"  :"+xin.value+" "+xin.count);
                        lian=word;
                        //删除单词链中单词个数最多的
                        while(lian.next!=null)
                        {
                            if(lian.next.value.equalsIgnoreCase(xin.value))
                            {
                                lian.next=lian.next.next;
                                break;
                            }
                            lian=lian.next;
                        }
                    }
                    
                }            
            }         
    public static void main(String[] args) throws IOException {
        danci rf = new danci();
        rf.getFileList();
    }

代码截图:

 三:指定文件目录,但是会递归目录下的所有子目录,每个文件执行统计单词的数量以及百分比

package file;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeMap;
import java.util.TreeSet;

public class dancichachong
{
    //F:\\\\\\\\备用\\\\\\\\english.txt
   public static void main(String[] args) throws IOException
{
       System.out.println("请输入所要遍历的文件的路径:");
       Scanner sc=new Scanner(System.in);
        File file=getfile();
        bianli(file);
        System.out.println("请选择要查询的文档");
        String name=sc.next();
        display(name);

        
       
        
}
    public static void bianli(File file) {
        File [] yue=file.listFiles();
        for(File fi:yue) {
            if(!fi.isDirectory()) {
            if(fi.getName().endsWith(".txt")) {
                System.out.println(fi.getPath());
            }
            }
            else {
                bianli(fi);
            }
        }
      
    }
   public static void display(String path) throws IOException {
       Scanner sc=new Scanner (System.in);
       BufferedReader br=new BufferedReader(new FileReader(path));        
        int c;
        TreeMap<String,Integer> tm=new TreeMap<>();
        String line;
        int kt=0;
        while((line=br.readLine())!=null) {
            String [] str=line.split("[^a-zA-Z]");            
            for(int i=0;i<str.length;i++) {
                if(!str[i].equals("")) {
            tm.put(str[i],tm.containsKey(str[i])?tm.get(str[i])+1:1);}
            }
            }    
        br.close();
        int max=0;
        int sum=0;
        int t=0;
        for(String k: tm.keySet()) {
            sum=sum+tm.get(k);
            if(max<=tm.get(k)) {
                max=tm.get(k);
            }
          }
       
       TreeSet<String> ts=new TreeSet<>(new Comparator<String>()
        {
           public int compare(String a,String b) {
               int num=tm.get(a)-tm.get(b);
               return num==0?1:(-num);
           }
        });
       for(String k: tm.keySet()) {
           ts.add(k);
       }
       DecimalFormat df = new DecimalFormat("0.00%");
        System.out.println("请输入要查询的个数");
       int count=sc.nextInt();
       int q=0,i=1;
       for (String s : ts)
        {
           if(q==count) {
               break;
           }
           else {
               q++;
               float bai=(float)tm.get(s)/sum;
               System.out.println(i+" "+s+" "+tm.get(s)+" "+df.format(bai));
           }
          i++;    
        }
          
   }
   public static File getfile() {
       Scanner sc=new Scanner(System.in);
       while(true) {
       String line=sc.nextLine();
       File kk=new File(line);
       if(!kk.exists()) {
           System.out.println("输入的不是文件夹,请重新输入");
       }
       else if(kk.isFile()) {
           System.out.println("输入的是文件路径,请重新输入");
       }
       else {
           return kk;
       }
       
}
}
}

代码测试截图:

猜你喜欢

转载自www.cnblogs.com/hhjing/p/11795598.html