Yang

文件读写兼分析数据课堂测试

一、测试

英语的26 个字母的频率在一本小说中是如何分布的?某类型文章中常出现的单词是什么?某作家最常用的词汇是什么?《飘》 中最常用的短语是什么,等等

1、要求1:

输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后面两位

(注:1、字母频率 = 这个字母出现的次数 / (所有A-Z,a-z字母出现的总数)

           2、如果两个字母出现的频率一样,那么就按照字典序排列)

 

程序设计思路:

 1、创建一个char 数组word,存入a-Z  52个字母,再创建一个52个空间的double数组wordnum ,用来存储a-Z出现的次数,再定义一个double型总字母数sum

2、循环读入字符,每次按32个字符读取文件,遍历这32个字符中每个字符与word中字母进行匹配,匹配成功,则对应的wordnum加1,并且总字母数sum加1

3、用比较排序法对wordnum中最大元素下标max进行查找,找到就输出wordnum[max]和word[max],然后根据wordnum[max]和总字母数sum计算并控制位数输出百分比

4、再将max和wordnum[max]都等于0,循环52次第三步即可

 

源代码:

import java.io.*;
import java.text.DecimalFormat;

public class Sumzimu
{
    static DecimalFormat df=new DecimalFormat("######0.00");
    public static void main(String[] args) throws IOException
    {
        FileReader fr = null;
        try
        {
            //创建字符输入流
            fr = new FileReader("C:\\Users\\米羊\\Desktop\\Harry Potter and the Sorcerer's Stone.txt");
            //创建一个长度为32的“竹筒”
            char[] cbuf = new char[32];
            char [] word= {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
            double [] wordnum = new double [52];
            double sum=0;
            for(int i=0;i<52;i++) {
                wordnum[i]=0;
            }
            //用于保存实际读取的字符数
            int hasRead = 0;
            char input ;
            //使用循环来重复“取水”过程
            while ((hasRead = fr.read(cbuf)) > 0 )
            {
                for(int i=0;i<32;i++)
                {
                    input = cbuf[i];
                    for(int j=0;j<52;j++) {
                        if(input==word[j]) {
                            wordnum[j]++;
                            sum++;
                        }
                    }
                }
                //取出“竹筒”中水滴(字节),将字符数组转换成字符串输入!
                //System.out.print(new String(cbuf , 0 , hasRead));
            }
            //System.out.println(sum);
            int maxnum=0;
            for(int i=0;i<52;i++)
            {
                maxnum = 0;
                for(int j=0;j<52;j++)
                {
                    if(wordnum[maxnum]<wordnum[j])
                        maxnum=j;
                }
                System.out.println(word[maxnum]+" "+df.format(wordnum[maxnum]/sum*100)+"%");
                wordnum[maxnum]=0;
            }
        }
        catch (IOException ioe)
        {
            ioe.printStackTrace();
        }
        finally
        {
            //使用finally块来关闭文件输入流
            if (fr != null)
            {
                fr.close();
            }
        }
    }
}

 

测试截图

 

 

 

2、要求2

输出单个文件中的前 N 个最常出现的英语单词

要求以英文字母开头,由英文字母和字母数字符号组成的字符串视为一个单词。单词以分隔符分割且不区分大小写。在输出时,所有单词都用小写字符表示

 

程序设计思路:

(1)循环读取,按行读取文件,并将读取出的行用toLowerCase()把大写改成小写,并按空格分割存进String数组中

(2)对String数组进行去重。并存到另一个String数组中

(3)对所有单词进行遍历,求出每个不重复单词的个数并将其存入int数组。

(4)用比较排序法输出前N个出现次数最多的单词

 

源代码

import java.util.*;
import java.io.*;

public class Sumdanci {
   private static String str="";
   private static BufferedReader cin = null;
   private static String a[]= new String[100000];
   private static int b[]= new int[100000];
   private static String c[]= new String[100000];
   private static int length = 0;
   private static int rlength = 0;
   private static int n = 0;
   private static int m = 0;
   
   
   public static void Input() throws IOException{
   {
       while(str!=null)
       {
       str=str.toLowerCase();//大写字母变小写
       for(int i=0;i<str.length();i++)
       {
           if((str.charAt(i)>96&&str.charAt(i)<123)) {
               a[m]=a[m]+str.charAt(i);
           }
           if(str.charAt(i)==' '||str.charAt(i)==','||str.charAt(i)=='.')
           {
               if(!a[m].equals("")) {
                   m=m+1;
                   a[m]="";
               }
           }
       }
       str=cin.readLine();  
       }
       length=m;
   }
   }
  
   public static void Removesame() {
       for(int i=0;i<length;i++) {
           b[i]=0;
       }
       c[0]=a[0];
       int count = 1;
       boolean s = true;
       for(int i=1;i<length;i++) {
           s = false ;
           for(int j=0;j<count;j++) {
               if(a[i].equals(c[j])) {
                   s = true;
                   break;
               }
           }
           if(!s) {
               c[count] = a[i];
               count++;
           }
       }
       
      rlength=count;
      
      for(int i=0;i<rlength;i++) {
          for(int j=0;j<length;j++) {
              if(c[i].equals(a[j])) 
                  b[i]=b[i]+1;
          }
      }
   }
   public static void Display() {
       int max=0;
       for(int i=1;i<=n;i++) {
           max=0;
           for(int j=0;j<rlength;j++) {
               if(b[max]<b[j]) {
                   max=j;
               }
           }
         System.out.println("出现次数第"+i+"多的是: "+c[max]+"出现了: "+b[max]+"次");
         b[max]=0;
       }
   }
   public static void ReadFile() {
       try {
       File file=new File("C:\\Users\\米羊\\Desktop\\Harry Potter and the Sorcerer's Stone.txt");
       InputStreamReader read = new InputStreamReader(new FileInputStream(file),"UTF-8");//指定字符编码
       cin=new BufferedReader(read);
       str=cin.readLine();
       Input();
       cin.close();
       read.close();
   }
       catch(FileNotFoundException e)
        {
            System.out.println("找不到指定文件");
        }
        catch(IOException e)
        {
            System.out.println("文件读取错误");
        }
   }
   public static void main(String[] args) {
       System.out.println("请输入你想统计前N个出现次数最多单词的N");
       Scanner input =new Scanner(System.in);
       n=input.nextInt();
       a[0]="";
       ReadFile();
       Removesame();
       Display();
       input.close();
       System.out.println("输出完毕");
   }
   
   }

 

测试截图

 

 

 

3、要求3的功能1

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

 

程序设计思路:

(1)循环读取,按行读取文件,并将读取出的行用toLowerCase()把大写改成小写,并按空格分割存进String数组中

(2)对String数组进行去重。并存到另一个String数组中

(3)对所有单词进行遍历,求出每个不重复单词的个数并将其存入int数组。

(4)用比较排序法按从多到少输出所有单词及其个数

 

源代码:

import java.util.*;
import java.io.*;

public class Sumdanci1 {
   private static String str="";
   private static BufferedReader cin = null;
   private static String a[]= new String[100000];
   private static int b[]= new int[100000];
   private static String c[]= new String[100000];
   private static int length = 0;
   private static int rlength = 0;
   private static int n = 0;
   private static int m = 0;
   
   
   public static void Input() throws IOException{
   {
       while(str!=null)
       {
       str=str.toLowerCase();//大写字母变小写
       for(int i=0;i<str.length();i++)
       {
           if((str.charAt(i)>96&&str.charAt(i)<123)) {
               a[m]=a[m]+str.charAt(i);
           }
           if(str.charAt(i)==' '||str.charAt(i)==','||str.charAt(i)=='.')
           {
               if(!a[m].equals("")) {
                   m=m+1;
                   a[m]="";
               }
           }
       }
       str=cin.readLine();  
       }
       length=m;
   }
   }
  
   public static void Removesame() {
       for(int i=0;i<length;i++) {
           b[i]=0;
       }
       c[0]=a[0];
       int count = 1;
       boolean s = true;
       for(int i=1;i<length;i++) {
           s = false ;
           for(int j=0;j<count;j++) {
               if(a[i].equals(c[j])) {
                   s = true;
                   break;
               }
           }
           if(!s) {
               c[count] = a[i];
               count++;
           }
       }
       
      rlength=count;
      
      for(int i=0;i<rlength;i++) {
          for(int j=0;j<length;j++) {
              if(c[i].equals(a[j])) 
                  b[i]=b[i]+1;
          }
      }
   }
   
   public static void ReadFile() {
       try {
       File file=new File("C:\\Users\\米羊\\Desktop\\Harry Potter and the Sorcerer's Stone.txt");
       InputStreamReader read = new InputStreamReader(new FileInputStream(file),"UTF-8");//指定字符编码
       cin=new BufferedReader(read);
       str=cin.readLine();
       Input();
       cin.close();
       read.close();
   }
       catch(FileNotFoundException e)
        {
            System.out.println("找不到指定文件");
        }
        catch(IOException e)
        {
            System.out.println("文件读取错误");
        }
   }
   
   public static void Writefile() throws IOException {
       File file=new File("C:\\Users\\米羊\\Desktop\\fenxijieguo.txt");
       if(!file.exists())
           file.createNewFile();
       FileWriter write = new FileWriter(file,true);
       BufferedWriter out=new BufferedWriter(write);
       int max=0;
       for(int i=1;i<=rlength;i++) {
           max=0;
           for(int j=0;j<rlength;j++) {
               if(b[max]<b[j]) {
                   max=j;
               }
           }
           System.out.println("出现次数第"+i+"多的是: "+c[max]+"出现了: "+b[max]+"次");
           out.write("出现次数第"+i+"多的是: "+c[max]+"出现了: "+b[max]+"次");
           out.newLine();
         b[max]=0;
       }
       out.close();
   }
   public static void main(String[] args) throws IOException {
      
       a[0]="";
       ReadFile();
       Removesame();
       Writefile();
       System.out.println("输出完毕");
   }
   
   }

 

测试截图

 

 

 

这是输出到文件中

 

 

 

 

 

4、要求3的功能2:

指定文件目录,对目录下每一个文件执行  功能1的操作

 

程序设计思路:

(1)找出用户指定目录中的所有文件,将文件路径名存入String数组

(2)对所有文件路径名进行去重。并存到另一个String数组中

(3)对所有文件路径名进行遍历,求出每个文件路径名的个数存入一个int数组

(4)用比较排序法对int数组进行排序

(4)输出所有文件路径名及其对应int数组中元素的值

 

源代码:

import java.io.*;
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.*;

public class Sumdanci2 {
   private static String str="";
   private static BufferedReader cin = null;
   private static String a[]= new String[100000];
   private static int b[]= new int[100000];
   private static String c[]= new String[100000];
   private static int length = 0;
   private static int rlength = 0;
   private static int n = 0;
   private static int m = 0;
   
   static File[] list = new File("D:\\Test").listFiles();
   
  
   public static void Removesame() {
       for(int i=0;i<length;i++) {
           b[i]=0;
       }
       c[0]=a[0];
       int count = 1;
       boolean s = true;
       for(int i=1;i<length;i++) {
           s = false ;
           for(int j=0;j<count;j++) {
               if(a[i].equals(c[j])) {
                   s = true;
                   break;
               }
           }
           if(!s) {
               c[count] = a[i];
               count++;
           }
       }
       
      rlength=count;
      
      for(int i=0;i<rlength;i++) {
          for(int j=0;j<length;j++) {
              if(c[i].equals(a[j])) 
                  b[i]=b[i]+1;
          }
      }
   }
   
   public static void Display() {
       int max=0;
       for(int i=0;i<rlength;i++) {
           max=0;
           for(int j=0;j<rlength;j++) {
               if(b[max]<b[j]) {
                   max=j;
               }
           }
           System.out.print(c[i]+"    "+b[i]+"   ");
           System.out.printf("%.2f",(double)b[i]/rlength*100);
           System.out.print("%");
           System.out.println("");
         b[max]=0;
       }
 
   }
 
  
   public static void rode(File[] list) {
        for(File file : list)
        {
           if(file.isFile())
           {  
               a[length]=file.getAbsolutePath();
               length++;
               
           }
        }
    }
   public static void main(String[] args) throws IOException {
      
       rode(list);
       Removesame();
       Display();
       System.out.println("输出完毕");
   }
   
   }
    

 

测试截图

 

 

 

 

5、要求3的功能3

指定文件目录, 但是会递归遍历目录下的所有子目录,每个文件执行功能1的做操作

 

程序设计思路:

(1)找出用户指定目录中的所有文件路径名存入一个String数组,如果是文件夹再递归调用之前操作(找出用户指定目录中的所有文件路径名存入一个String数组)

(2)对所有文件路径名进行去重。并存到另一个String数组中

(3)对所有文件路径名进行遍历,求出每个文件路径名的个数存入一个int数组

(4)用比较排序法对int数组进行排序

(4)输出所有文件路径名及其对应int数组中元素的值

 

源代码:

import java.io.*;
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;

public class Sumdanci3{
private static String str="";
private static BufferedReader cin = null;
private static String a[]= new String[100000];
private static int b[]= new int[100000];
private static String c[]= new String[100000];
private static int length = 0;
private static int rlength = 0;
private static int n = 0;
private static int m = 0;

static File[] list = new File("D:\\Test").listFiles();


public static void Removesame() {
       for(int i=0;i<length;i++) {
           b[i]=0;
       }
       c[0]=a[0];
       int count = 1;
       boolean s = true;
       for(int i=1;i<length;i++) {
           s = false ;
           for(int j=0;j<count;j++) {
               if(a[i].equals(c[j])) {
                   s = true;
                   break;
               }
           }
           if(!s) {
               c[count] = a[i];
               count++;
           }
       }
       
      rlength=count;
      
      for(int i=0;i<rlength;i++) {
          for(int j=0;j<length;j++) {
              if(c[i].equals(a[j])) 
                  b[i]=b[i]+1;
          }
      }
}

public static void Display() {
       int max=0;
       for(int i=0;i<rlength;i++) {
           max=0;
           for(int j=0;j<rlength;j++) {
               if(b[max]<b[j]) {
                   max=j;
               }
           }
           System.out.print(c[i]+"    "+b[i]+"   ");
        System.out.printf("%.2f",(double)b[i]/rlength*100);
        System.out.print("%");
        System.out.println("");
         b[max]=0;
       }

}


public static void rode(File[] list) {
    for(File file : list)
    {
       if(file.isFile())
       {  
           a[length++]=file.getAbsolutePath();
           
       
       }
       else if(file.isDirectory()) {
           String str3=file.getAbsolutePath();
           list = new File(str3).listFiles();
           rode(list);
       }
    }
    }
public static void main(String[] args) throws IOException {
      
       rode(list);
       Removesame();
       Display();
       System.out.println("输出完毕");
}

}

 

测试截图

 

 

 

 

posted on 2019-11-06 11:45  yangliuliu  阅读(197)  评论(0编辑  收藏  举报

导航