课堂练习----单词统计
用户需求:
英语的26 个字母的频率在一本小说中是如何分布的?某类型文章中常出现的单词是什么?某作家最常用的词汇是什么?《哈利波特》 中最常用的短语是什么,等等。我们就写一些程序来解决这个问题,满足一下我们的好奇心。
第0步:输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后面两位。字母频率 = 这个字母出现的次数 / (所有A-Z,a-z字母出现的总数)如果两个字母出现的频率一样,那么就按照字典序排列。 如果 S 和 T 出现频率都是 10.21%, 那么, S 要排在T 的前面。
第1步:输出单个文件中的前 N 个最常出现的英语单词。作用:一个用于统计文本文件中的英语单词出现频率。单词:以英文字母开头,由英文字母和字母数字符号组成的字符串视为一个单词。单词以分隔符分割且不区分大小写。在输出时,所有单词都用小写字符表示。英文字母:A-Z,a-z字母数字符号:A-Z,a-z,0-9
第2步:输出单个文件中的前 N 个最常出现的英语单词。分割符:空格,非字母数字符号 例:good123是一个单词,123good不是一个单词。good,Good和GOOD是同一个单词。
readFromFile.java
1 import java.io.BufferedReader; 2 import java.io.File; 3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.InputStreamReader; 7 import java.io.OutputStreamWriter; 8 //import java.io.Reader; 9 //从文本文档中读入 10 public class readFromFile { 11 public static String readTxtFile(String filePath){ 12 try { 13 String encoding="GBK"; 14 File file=new File(filePath); 15 if(file.isFile() && file.exists()){ //判断文件是否存在 16 InputStreamReader read = new InputStreamReader( 17 new FileInputStream(file),encoding);//考虑到编码格式 18 BufferedReader bufferedReader = new BufferedReader(read); 19 String lineTxt = null; 20 String lineText=""; 21 while((lineTxt = bufferedReader.readLine()) != null) 22 { 23 lineText+=(lineTxt); 24 } 25 read.close(); 26 return lineText; 27 } 28 else 29 { 30 System.out.println("找不到指定的文件"); 31 } 32 } catch (Exception e) { 33 System.out.println("读取文件内容出错"); 34 e.printStackTrace(); 35 } 36 return null; 37 } 38 public static void daochu(String a) throws IOException 39 { 40 File file=new File("b.txt"); 41 FileOutputStream fos=new FileOutputStream(file); 42 OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8"); 43 osw.append(a); 44 osw.close(); 45 fos.close(); 46 } 47 }
Text.java
1 import java.io.BufferedReader; 2 import java.io.File; 3 import java.io.FileNotFoundException; 4 import java.io.FileReader; 5 import java.io.IOException; 6 import java.text.DecimalFormat; 7 import java.text.NumberFormat; 8 import java.util.ArrayList; 9 import java.util.HashMap; 10 import java.util.Iterator; 11 import java.util.Scanner; 12 public class Text { 13 static int N=5; 14 public static String StatList(String str) { 15 StringBuffer sb = new StringBuffer(); 16 HashMap<String ,Integer> has = new HashMap<String ,Integer> (); // 打开一个哈希表 17 String[] slist = str.split("[^a-zA-Z\']+"); 18 for (int i = 0; i < slist.length; i++) 19 { 20 if (!has.containsKey(slist[i])) 21 { 22 has.put(slist[i], 1); 23 } 24 else 25 { 26 has.put(slist[i],has.get(slist[i])+1 ); 27 } 28 } 29 Iterator<String> iterator = has.keySet().iterator(); 30 String a[]=new String[100]; 31 int s[]=new int[100]; 32 int judge; 33 int n; 34 Scanner in=new Scanner(System.in); 35 System.out.println("输入前n个最常出现的单词:"); 36 n=in.nextInt(); 37 for(int i=0;i<n;i++) 38 { 39 iterator = has.keySet().iterator(); 40 while(iterator.hasNext()) 41 { 42 String word = (String) iterator.next(); 43 if(s[i]<has.get(word)) 44 { 45 s[i]=has.get(word); 46 a[i]=word; 47 } 48 } 49 judge=woor(a[i]); 50 if(judge==1) 51 { 52 n++; 53 has.remove(a[i]); 54 } 55 else 56 { 57 sb.append("单词:").append(a[i]).append(" 次数").append(has.get(a[i])).append("\r\n"); 58 has.remove(a[i]); 59 } 60 } 61 return sb.toString(); 62 } 63 64 65 public static void main(String[] args) 66 { 67 File file = new File("a"); 68 // TODO Auto-generated method stub 69 // ArrayList<String> fil=getFiles("a");//目录下的文件 70 ArrayList<String> fil=getDirectory(file);//目录下的文件和子目录里的文件 71 for(int i=0;i<fil.size();i++) 72 { 73 String filePath = fil.get(i); 74 String sz=writeFromFile.readTxtFile(filePath); 75 zimu(filePath); 76 String ltxt=null; 77 System.out.println(ltxt=StatList(sz)); 78 try { 79 writeFromFile.daochu(ltxt); 80 } catch (IOException e) { 81 // TODO Auto-generated catch block 82 e.printStackTrace(); 83 } 84 } 85 } 86 public static int woor(String a) 87 { 88 int n=0; 89 String[] biao= {"a","the","an"}; 90 for(int i=0;i<biao.length;i++) 91 { 92 if(biao[i].equals(a)) 93 { 94 n=1; 95 } 96 } 97 return n; 98 } 99 public static ArrayList<String> getFiles(String path) { 100 ArrayList<String> files = new ArrayList<String>(); 101 File file = new File(path); 102 File[] tempList = file.listFiles(); 103 for (int i = 0; i < tempList.length; i++) { 104 if (tempList[i].isFile()) { 105 files.add(tempList[i].toString()); 106 } 107 if (tempList[i].isDirectory()) { 108 } 109 } 110 return files; 111 } 112 private static ArrayList<String> getDirectory(File file) { 113 ArrayList<String> files = new ArrayList<String>(); 114 ArrayList<String> files1 = new ArrayList<String>(); 115 //获取该目录下的文件列表 116 File flist[] = file.listFiles(); 117 for (File f : flist) { 118 if (f.isDirectory()) { 119 // 如果f是一个目录 120 files1=getFiles(f.getAbsolutePath()); 121 files.addAll(files1); 122 123 getDirectory(f); 124 } else { 125 //如果f是一个文件 126 files.add(f.getAbsolutePath()); 127 } 128 } 129 return files; 130 } 131 public static void zimu(String path) 132 { 133 try { 134 //IO操作读取文件内容 135 FileReader fr = new FileReader(path); 136 BufferedReader br = new BufferedReader(fr); 137 DecimalFormat df = new DecimalFormat("#.00"); 138 HashMap<String, Integer> map = new HashMap<String, Integer>(); 139 140 String string =null; 141 Integer count = 0;//每个字母的次数 142 Integer total = 0;//总共多少个字母 143 144 try { 145 while ((string=br.readLine())!=null) { 146 char[] ch = string.toCharArray(); 147 148 for (int i = 0; i < ch.length; i++) { 149 if (ch[i] > 'A' && ch[i]< 'z') { 150 151 total++; 152 ch[i] = Character.toLowerCase(ch[i]); 153 count = map.get(ch[i]+""); 154 if (count == null) { 155 count = 1; 156 }else { 157 count++; 158 } 159 map.put(ch[i]+"", count); 160 } 161 } 162 } 163 } catch (IOException e) { 164 // TODO Auto-generated catch block 165 e.printStackTrace(); 166 } 167 ArrayList<String> list = new ArrayList<String>(); 168 list.addAll(map.keySet()); //将单词添加到list中 169 NumberFormat numberFormat = NumberFormat.getInstance(); 170 171 // 设置精确到小数点后2位 172 173 numberFormat.setMaximumFractionDigits(2); 174 175 //排序按照出现次数降序排列 176 for(int i = 0;i < list.size();i++) 177 { 178 179 for(int j = 0;j < (list.size() - i-1);j++) //list.size() - i-1因为要用到i+1要考虑是否超出范围的问题 180 { 181 182 if(map.get(list.get(j)) < map.get(list.get(j+1))) 183 { 184 String t = list.get(j); 185 list.set(j, list.get(j+1)); 186 list.set( j+1, t); 187 } 188 } 189 } 190 for(int i = 0 ; i < list.size();i++) 191 { 192 193 System.out.println(list.get(i) + ":" + map.get(list.get(i)) +" "+ df.format(((float)map.get(list.get(i)))*100/total) + "%"); 194 } 195 196 197 } catch (FileNotFoundException e) { 198 // TODO Auto-generated catch block 199 e.printStackTrace(); 200 } 201 } 202 203 204 205 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~