zoukankan      html  css  js  c++  java
  • 统计单词,字母的次数和频率

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

    思路: 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;
           }
           
    }
    }
    }

    代码测试截图:

  • 相关阅读:
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1553 数字反转(升级版)
    8.4 确定两个日期之间的月份数或年数
    (Java实现) 洛谷 P1553 数字反转(升级版)
  • 原文地址:https://www.cnblogs.com/hhjing/p/11795598.html
Copyright © 2011-2022 走看看