Post List Widget

header ads

统计某个文件中数字、字母等出现的次数


这道题与下面这道题出自于我今天的面试,实现的需求大同小异。但是我却不会,没能做出来,这里做一下笔记。

package com.example.study_source.pager;

import org.junit.Test;

import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
* @author 030
* @date 19:37 2021/10/25
* @description 统计某个文件中目标内容的个数
*/
public class FileStatisticsTest {

   /**
    * 统计str中包含的数字
    *
    * @param str 目标字符串
    * @return 包含数字的个数
    */
   private static long getNumCnt(String str) {
       // 统计个数
       // 注意:基础数据类型作为普通变量(定义在方法内部的变量),不会进行初始化,直接应用时会报编译错误;如下代码,若是不初始化会报错
       // 当作为 成员变量 (类的成员变量)时,如果你只是声明并没有没有显式地进行初始化,这时Java会自动进行初始化操作,赋给默认值,
       // 注意:long 变量的默认值是 0L
       long cnt = 0L;
       // 正则匹配模式
       String regex = "\\d";
       Pattern p = Pattern.compile(regex);
       Matcher matcher = p.matcher(str);
       while (matcher.find()) {
           cnt++;
      }
       return cnt;
  }


   /**
    * 统计str中包含的空格个数
    *
    * @param str
    * @return
    */
   private static long getSpaceCnt(String str) {
       // 注意:基础数据类型作为普通变量(定义在方法内部的变量),不会进行初始化,直接应用时会报编译错误;如下代码,若是不初始化会报错
       // 当作为 成员变量 (类的成员变量)时,如果你只是声明并没有没有显式地进行初始化,这时Java会自动进行初始化操作,赋给默认值,
       // 注意:long 变量的默认值是 0L
       long cnt = 0L;
       String regex = "\\s";
       Pattern p = Pattern.compile(regex);
       Matcher matcher = p.matcher(str);
       while (matcher.find()) {
           cnt++;
      }
       return cnt;
  }

   /**
    * 统计str中包含的汉字个数
    *
    * @param str
    * @return
    */
   private static long getChineseCnt(String str) {
       // 注意:基础数据类型作为普通变量(定义在方法内部的变量),不会进行初始化,直接应用时会报编译错误;如下代码,若是不初始化会报错
       // 当作为 成员变量 (类的成员变量)时,如果你只是声明并没有没有显式地进行初始化,这时Java会自动进行初始化操作,赋给默认值,
       // 注意:long 变量的默认值是 0L
       long cnt = 0L;
       String regex = "[\\u4e00-\\u9fa5]";
       Pattern p = Pattern.compile(regex);
       Matcher matcher = p.matcher(str);
       while (matcher.find()) {
           cnt++;
      }
       return cnt;
  }

   /**
    * 统计str中包含的字母个数
    *
    * @param str
    * @return
    */
   private static long getLetterCnt(String str) {
       // 注意:基础数据类型作为普通变量(定义在方法内部的变量),不会进行初始化,直接应用时会报编译错误;如下代码,若是不初始化会报错
       // 当作为 成员变量 (类的成员变量)时,如果你只是声明并没有没有显式地进行初始化,这时Java会自动进行初始化操作,赋给默认值,
       // 注意:long 变量的默认值是 0L
       long cnt = 0L;
       String regex = "[a-zA-Z]";
       Pattern p = Pattern.compile(regex);
       Matcher matcher = p.matcher(str);
       while (matcher.find()) {
           cnt++;
      }
       return cnt;
  }

   /**
    * 统计str中包含的标点符号个数
    *
    * @param str
    * @return
    */
   private static long getPunctuationCnt(String str) {
       // 注意:基础数据类型作为普通变量(定义在方法内部的变量),不会进行初始化,直接应用时会报编译错误;如下代码,若是不初始化会报错
       // 当作为 成员变量 (类的成员变量)时,如果你只是声明并没有没有显式地进行初始化,这时Java会自动进行初始化操作,赋给默认值,
       // 注意:long 变量的默认值是 0L
       long cnt = 0L;
       String regex = "[\\pP\\p{Punct}]";
       Pattern p = Pattern.compile(regex);
       Matcher matcher = p.matcher(str);
       while (matcher.find()) {
           cnt++;
      }
       return cnt;
  }

   /**
    * 统计str中包含的任意字符个数(包括换行符,如果不想包括,只需修改正则即可)
    *
    * @param str
    * @return
    */
   private static long getCharCnt(String str) {
       // 注意:基础数据类型作为普通变量(定义在方法内部的变量),不会进行初始化,直接应用时会报编译错误;如下代码,若是不初始化会报错
       // 当作为 成员变量 (类的成员变量)时,如果你只是声明并没有没有显式地进行初始化,这时Java会自动进行初始化操作,赋给默认值,
       // 注意:long 变量的默认值是 0L
       long cnt = 0L;
       // 正则表达式中,使用.可以匹配任意字符,但是这其中不包含换行符\n
       // 要想使用正则表达式匹配包含换行符在内的任意字符,可以使用下面几种写法:
       // ([\s\S]*) 或者 ([\d\D]*) 或者 ([\w\W]*)
       String regex = ".";
       Pattern p = Pattern.compile(regex);
       Matcher matcher = p.matcher(str);
       while (matcher.find()) {
           cnt++;
      }
       return cnt;
  }



   /**
    * 测试:输出目标文件中包含多少行,多少个数字,多少个空格,多少个汉字, 多少个字母,多少个标点符号,多少个字符
    * 以 txt 文件为例
    */
   @Test   // 注意:单元测试方法不能有 返回值,因为单元测试是对每个独立功能的验证测试,有返回值,别的测试方法就可以调用了,这样不符合单元测试的初衷。
   public void testCnt() {
       String filePath = "E:\\webp\\test1\\2.txt";
       int lineCnt = 0, numCnt = 0, spaceCnt = 0, chineseCnt = 0, letterCnt = 0, punctuationCnt = 0, charCnt = 0;
       try {
           File file = new File(filePath);
           FileReader fileReader = new FileReader(file);
           BufferedReader bufferedReader = new BufferedReader(fileReader);
           String strLine = "";
           while ((strLine = bufferedReader.readLine()) != null) {
               // 行数
               lineCnt++;
               // 数字个数
               numCnt += getNumCnt(strLine);
               // 空格
               spaceCnt += getSpaceCnt(strLine);
               // 汉字
               chineseCnt += getChineseCnt(strLine);
               // 字母
               letterCnt += getLetterCnt(strLine);
               // 标点符号
               punctuationCnt += getPunctuationCnt(strLine);
               // 字符
               charCnt += getCharCnt(strLine);
          }
      } catch (FileNotFoundException e) {
           e.printStackTrace();
      } catch (IOException e) {
           e.printStackTrace();
      }
       System.out.println("该文件总共: " + lineCnt + "行," + numCnt + " 个数字," + spaceCnt + " 个空格," + chineseCnt + " 个汉字,"
               + letterCnt + " 个字母," + punctuationCnt + " 个标点符号," + charCnt + " 个字符。");
  }


   /**************************************************复习一下文件复制操作 start **************************************************/
   private void copyFile(File file) throws Exception {
       // 构造一个输入流,从硬盘读取内容到内存
       FileInputStream fis = new FileInputStream(file);
       String outputPath = "E:\\webp\\copy.txt";
       File file1 = new File(outputPath);
       FileOutputStream fos = new FileOutputStream(file1);
       byte[] buffer = new byte[1024];
       int len = 0;
       while ((len = fis.read(buffer)) != -1) {
           fos.write(buffer, 0, len);
      }
       fos.close();
       fis.close();
       System.out.println("finished ...");
  }

   @Test
   public void test() throws Exception {
       String url = "E:\\webp\\test1\\1.txt";
       File file = new File(url);
       copyFile(file);
  }
   /**************************************************复习一下文件复制操作 end **************************************************/
}

Post a Comment

0 Comments