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;
           }
           
    }
    }
    }

    代码测试截图:

  • 相关阅读:
    转:mac下安装homebrew
    jdk1.7下载路径
    转: Mac 使用ADT的问题
    转:mac下安装Sublime Text
    转: SVN和Git的一些用法总结
    转: SVN使用教程总结(图文丰富,相当详细)
    转:Tortoise SVN 版本控制常用操作知识
    Android Java混淆(ProGuard)
    转:美团Android资源混淆保护实践
    【IPC进程间通讯之三】内存映射文件Mapping File
  • 原文地址:https://www.cnblogs.com/hhjing/p/11795598.html
Copyright © 2011-2022 走看看