1.输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后面两位。
字母频率 = 这个字母出现的次数 / (所有A-Z,a-z字母出现的总数)
如果两个字母出现的频率一样,那么就按照字典序排列。

思路:(1)读取文件,然后每个字符都记录;

   (2)声明数组time[]用来记录每个字母出现的次数。

   (3)声明sum用来记录字母出现的总次数

   (4)数组rate[]用来记录每个字母的出现率

   (5)对rate[]进行排序。

代码:

package test;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.math.BigDecimal;
import java.math.RoundingMode;

public class Calculating {
    public static void main(String[] args) {
        File f = new  File("C:\\Users\\lenovo\\Desktop\\Harry Potter and the Sorcerer's Stone.txt");
        Reader reader; 
        int time [] = new int [52];//记录每个字母出现的次数 
        for(int i=0;i<52;i++)//将每个字母的次数初始化为0
        {
            time[i]=0;
        }
        try{
            reader = new InputStreamReader(new FileInputStream(f));   
            int tempchar;  
            while ((tempchar = reader.read()) != -1) { //是不是字母的条件如果是则执行自增操作
                    if(((tempchar>96)&&((tempchar<123))))
                    {
                        time[tempchar-97]++;
                    }
                    if(((tempchar)>64)&&((tempchar<91)))
                    {
                        time[tempchar-39]++;
                    }
            }  
            reader.close();//关闭
            int sum=0;//所有字母的总数
            for(int i=0;i<52;i++)//计算字母的总出现次数
            {
                sum+=time[i];
            }
            double rate [] = new  double [52];//存储每个字母出现次数所占总次数的比率
            for(int i=0;i<52;i++)//计算每个字母出现率
            {
                rate[i] = new BigDecimal(time[i]).divide(new BigDecimal(sum),4,RoundingMode.HALF_EVEN).doubleValue()*100;//格式化
            }
            String result [] = new String [52];//存储每个字母的出现次数和出现率
            for(int i=0;i<52;i++)
            {
                result[i] = "字母"+(char)(i>26?i+38:i+97)+"出现了"+time[i]+"次,"+"出现的频率为"+rate[i]+"%";
            }
            String str;
            int ti;
            for(int i=0;i<52;i++)//对rate[]排序
            {
                for(int j=i+1;j<52;j++)
                {
                    if(time[i]<time[j])
                    {
                        ti=time[i];
                        time[i]=time[j];
                        time[j]=ti;
                        str=result[i];
                        result[i]=result[j];
                        result[j]=str;
                    }
                }
            }
           for(int i=0;i<52;i++)
           {
               System.out.println(result[i]);//输出排序后的结果
           }
        }
        catch (IOException e) {  
            e.printStackTrace();  
            return;  
        }  
    }
}

运行结果:

文件的读取以及对读取内容的计数计算_java

 

 

体会:刚开始不会做,便参考了代码,但是要求和上课的也不完全一样,上课的是区分大小写,而参考的不是,看到了两个if()判断我也没有多想就把两个if给改了让大写的存在0-25,小写的存在26-51,这样存的话虽然结果对,但是字母却对不上,也就是说原本e的出现率是12%,可是输出却成了d的频率,因此在后面我花费了大量的时间来处理这个问题,直到验收完我才想到可以直接一个if就完事了,但是我没有改成一个if,我想让自己记住这个教训,其实编程不只是手上的活儿,更是脑子上的活儿,要先想好,这样后面才能一帆风顺。

 

 

2.输出单个文件中的前 N 个最常出现的英语单词。作用:一个用于统计文本文件中的英语单词出现频率的控制台程序;单词:以英文字母开头,由英文字母和字母数字符号组成的字符串视为一个单词。单词以分隔符分割且不区分大小写。在输出时,所有单词都用小写字符表示。

思路:(1)将单词转化为小写并且存入数组;

   (2)然后去重,并执行自增操作

  (3)读取文件

       (4)格式化输出

代码:

package test;

import java.io.File; 
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Scanner;
import java.io.BufferedReader;  
import java.io.BufferedWriter;  
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;  

public class WordCounting {  
    private static String str="";
    private static Scanner sc=new Scanner(System.in);
    private static BufferedReader br=null;
    private static String a[]=new String[1000000]; 
    private static String c[]=new String[10000000]; 
    private static int b[]=new int[1000000]; 
    private static int length=0;
    private static int l=0;
    private static int n=0;
    private static int j=0;
    public  static void  storage() throws IOException {//将单词存到数组a
    {    while(str!=null) {
            int i=0;
            str=str.toLowerCase(); //将大写改为小写
            for(i=0;i<str.length();i++) {
                if((str.charAt(i)>96&&str.charAt(i)<123)) {//判断是否为字母                    
                     a[j]=a[j]+str.charAt(i);    
                }
                 if(str.charAt(i)==' '||str.charAt(i)==','||str.charAt(i)=='.') {//一个单词结尾的条件空格,或者句号,或者逗号
                     if(!a[j].equals("")) {//不为空
                         j=j+1;
                         a[j]="";
                     }
                     }
                 
           }              
            str=br.readLine();//读取新的一行内容
    }
    length=j;
    }
    }
    public  static void  show() {//显示
        for(int k=0;k<n;k++) {
            System.out.print(c[k]+"\t"+b[k]+"   ");
            System.out.printf("%.2f",(double)b[k]/l*100);//格式化的输出
            System.out.print("%");//输出百分号
            System.out.println("");
        }
    }
    public  static void  Sorting() {//排序
        int t3=0;
        int t2=0;
        String sr="";
        for(int i=0;i<l-1;i++) {
                t3=i;
            for(int j=i+1;j<l;j++) {
                if(b[t3]<b[j]) {
                    t3=j;
                }
            }
           if(t3!=i) {
               t2=b[i];
               b[i]=b[t3];
               b[t3]=t2;
               sr=c[i];
               c[i]=c[t3];
               c[t3]=sr;
           }
        }
    }
    public static void deleteOverlap(){//去重
        for(int k=0;k<length;k++) {
            b[k]=0;
        }
        c[0]=a[0];
        int tt=1;
        Boolean rt=true;
        
        for(int i=1;i<length;i++) {
            rt=false;
            for(int j=0;j<tt;j++) {
                if(a[i].equals(c[j])) {
                    rt=true;
                    break;
                }
            }
            if(!rt) {
                c[tt]=a[i];
                tt++;
            }
        }
        l=tt;
        for(int i=0;i<l;i++) {
            for(int j=0;j<length;j++) {
                if(c[i].equals(a[j])) {
                    b[i]++;
                }
            }
        }
    }
    public static void Readfile() {//读取文件
        File file=new File("C:\\Users\\lenovo\\Desktop\\Harry Potter and the Sorcerer's Stone.txt");                                
        try {
            InputStreamReader read = new InputStreamReader(new FileInputStream(file),"UTF-8");
            br=new BufferedReader(read);
            str=br.readLine();
            storage();
            br.close();
            read.close();
        }
        catch(IOException e) {
            System.out.println("读取失败!");
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) throws IOException {
           System.out.println("请输入需要统计的个数:");
           n=sc.nextInt();
           a[0]="";
           Readfile();                    
           deleteOverlap();
           Sorting();
           show();   
    }  
    
}package test;

import java.io.File; 
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Scanner;
import java.io.BufferedReader;  
import java.io.BufferedWriter;  
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;  

public class WordCounting {  
    private static String str="";
    private static Scanner sc=new Scanner(System.in);
    private static BufferedReader br=null;
    private static String a[]=new String[1000000]; 
    private static String c[]=new String[10000000]; 
    private static int b[]=new int[1000000]; 
    private static int length=0;
    private static int l=0;
    private static int n=0;
    private static int j=0;
    public  static void  storage() throws IOException {//将单词存到数组a
    {    while(str!=null) {
            int i=0;
            str=str.toLowerCase(); //将大写改为小写
            for(i=0;i<str.length();i++) {
                if((str.charAt(i)>96&&str.charAt(i)<123)) {//判断是否为字母                    
                     a[j]=a[j]+str.charAt(i);    
                }
                 if(str.charAt(i)==' '||str.charAt(i)==','||str.charAt(i)=='.') {//一个单词结尾的条件空格,或者句号,或者逗号
                     if(!a[j].equals("")) {//不为空
                         j=j+1;
                         a[j]="";
                     }
                     }
                 
           }              
            str=br.readLine();//读取新的一行内容
    }
    length=j;
    }
    }
    public  static void  show() {//显示
        for(int k=0;k<n;k++) {
            System.out.print(c[k]+"\t"+b[k]+"   ");
            System.out.printf("%.2f",(double)b[k]/l*100);//格式化的输出
            System.out.print("%");//输出百分号
            System.out.println("");
        }
    }
    public  static void  Sorting() {//排序
        int t3=0;
        int t2=0;
        String sr="";
        for(int i=0;i<l-1;i++) {
                t3=i;
            for(int j=i+1;j<l;j++) {
                if(b[t3]<b[j]) {
                    t3=j;
                }
            }
           if(t3!=i) {
               t2=b[i];
               b[i]=b[t3];
               b[t3]=t2;
               sr=c[i];
               c[i]=c[t3];
               c[t3]=sr;
           }
        }
    }
    public static void deleteOverlap(){//去重
        for(int k=0;k<length;k++) {
            b[k]=0;
        }
        c[0]=a[0];
        int tt=1;
        Boolean rt=true;
        
        for(int i=1;i<length;i++) {
            rt=false;
            for(int j=0;j<tt;j++) {
                if(a[i].equals(c[j])) {
                    rt=true;
                    break;
                }
            }
            if(!rt) {
                c[tt]=a[i];
                tt++;
            }
        }
        l=tt;
        for(int i=0;i<l;i++) {
            for(int j=0;j<length;j++) {
                if(c[i].equals(a[j])) {
                    b[i]++;
                }
            }
        }
    }
    public static void Readfile() {//读取文件
        File file=new File("C:\\Users\\lenovo\\Desktop\\Harry Potter and the Sorcerer's Stone.txt");                                
        try {
            InputStreamReader read = new InputStreamReader(new FileInputStream(file),"UTF-8");
            br=new BufferedReader(read);
            str=br.readLine();
            storage();
            br.close();
            read.close();
        }
        catch(IOException e) {
            System.out.println("读取失败!");
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) throws IOException {
           System.out.println("请输入需要统计的个数:");
           n=sc.nextInt();
           a[0]="";
           Readfile();                    
           deleteOverlap();
           Sorting();
           show();   
    }  
    
}

运行截图:

文件的读取以及对读取内容的计数计算_java_02

 

 体会:之前用的是大数类的除法,但是还有标准化的暑促胡,语法与c语言类似,在下篇文章总加以介绍。

 

 

3.输出文件中所有不重复的单词,按照出现次数由多到少排列,出现次数同样多的,以字典序排列。

思路:(1)与之前的一样,存储到数组中,然后都输出

   (2)将结果输出到文件中。

package test;
import java.io.File; 
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Scanner;
import java.io.BufferedReader;  
import java.io.BufferedWriter;  
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;  

public class UnqueWord {  
    private static String str="";
    private static Scanner sc=new Scanner(System.in);
    private static BufferedReader cin=null;
    private static String a[]=new String[1000000]; 
    private static String c[]=new String[10000000]; 
    private static int b[]=new int[1000000]; 
    private static int length=0;
    private static int l=0;
    private static int nn=0;
    private static int j=0;
    public  static void  cun() throws IOException {//将单词存到数组
    {  while(str!=null) {
        
            int i=0;
            str=str.toLowerCase(); //把大写改成小写
            for(i=0;i<str.length();i++) {
                if((str.charAt(i)>96&&str.charAt(i)<123)) {                    
                     a[j]=a[j]+str.charAt(i);    
                }
                 if(str.charAt(i)==' '||str.charAt(i)==','||str.charAt(i)=='.') {
                     if(!a[j].equals("")) {
                         j=j+1;
                         a[j]="";
                     }
                     }
                 
           }              
            str=cin.readLine();
    }
    length=j;
    }
    }
public  static void  Sorting() {//排序
        int t3=0;
        int t2=0;
        String sr="";
        for(int i=0;i<l-1;i++) {
            t3=i;
            for(int j=i+1;j<l;j++) {
                if(b[t3]<b[j]) {
                    t3=j;
                }
            }
           if(t3!=i) {
               t2=b[i];
               b[i]=b[t3];
               b[t3]=t2;
               sr=c[i];
               c[i]=c[t3];
               c[t3]=sr;
           }
        }
    }
    public static void Statistics(){//去重
        for(int k=0;k<length;k++) {
            b[k]=0;
        }
        c[0]=a[0];
        int tt=1;
        Boolean rt=true;
        
        for(int i=1;i<length;i++) {
            rt=false;
            for(int j=0;j<tt;j++) {
                if(a[i].equals(c[j])) {
                    rt=true;
                    break;
                }
            }
            if(!rt) {
                c[tt]=a[i];
                tt++;
            }
        }
        l=tt;
        for(int i=0;i<l;i++) {
            for(int j=0;j<length;j++) {
                if(c[i].equals(a[j])) {
                    b[i]++;
                }
            }
        }
    }
    public static void Readfile() {//读取文件
        File file=new File("C:\\Users\\lenovo\\Desktop\\Harry Potter and the Sorcerer's Stone.txt");                                
        try {
            InputStreamReader read = new InputStreamReader(new FileInputStream(file),"UTF-8");
            cin=new BufferedReader(read);
            str=cin.readLine();
            cun();
            cin.close();
            read.close();
        }
        catch(IOException e) {
            System.out.println("读取失败!");
            e.printStackTrace();
        }
    }
    
    public static void Writefile() throws IOException {
        File file=new File("t1.txt");
        if(!file.exists())
            file.createNewFile();
        FileWriter write = new FileWriter(file,true);
        BufferedWriter out=new BufferedWriter(write);
        for(int i=0;i<l;i++){
            StringBuffer sb=new StringBuffer();
            out.write("这是第"+(i+1)+"个: ");
            
            double f4=(double)b[i]/l*100;
            out.write(c[i]+"\t"+b[i]+"\t"+f4);
            out.write("\r\n");
           
        }        
        out.close();
    }
    public static void show1() {
        for(int k=0;k<l;k++) {
                System.out.print(c[k]+"\t \t\t"+b[k]+"\n");
                
            }
    }public static void main(String[] args) throws IOException {

           a[0]="";
           Readfile();                    
           Statistics();
           Sorting();
           System.out.println("程序中不重复的单词!");
           show1();
           Writefile();

    }  
    
}

运行结果:

文件的读取以及对读取内容的计数计算_java_03文件的读取以及对读取内容的计数计算_java_04