用java实现输出英文小说飘中出现次数最多的前N个单词(附:使用文件读写)

本文参考于:<https://blog.csdn.net/u014204432/article/details/40348839&gt;

一、题目

输出单个文件(《飘》 英文版)中的前 N 个最常出现的英语单词,并将结果输入到文本文件中。

二、程序设计思路

1、首先将英文小说飘文件内容用文件读写方式读入StringBuffer中,然后一行一行读取并去掉句子和单词

间空格然后将StringBuffer转换成String,然后再将所有字符转化成小写字符,然后再将句子分割成单词并

存入字符数组。

2、随后遍历数组将其存入Map<String, Integer>中,不断映射字符串和整数,给每种单词或者每个字符数

组计数,映射出每个单词和其出现次数,在通过比较器实现降序排序,实现单词出现次数排序。

3.加上文件异常操作,最后输出英文小说飘中出现次数最多的前N个单词和其对应的次数

三、程序源代码

 1 import java.io.*;
 2 import java.util.*;
 3 import java.util.Map.Entry;
 4 
 5 public class tongjidanci 
 6 {
 7     public static int n=0;
 8     public static void main(String[] args) {
 9     Scanner input=new Scanner(System.in);
10     String s;
11     int count=0;
12     int num=1;
13     //作为FileReader和FileWriter读取的对象
14     String file1=&quot;C:\\Users\\米羊\\Desktop\\piao.txt&quot;;
15     String file2=&quot;C:\\Users\\米羊\\Desktop\\fenxijieguo.txt&quot;;
16     try
17     {
18       BufferedReader a=new BufferedReader(new FileReader(file1));
19       BufferedWriter b=new BufferedWriter(new FileWriter(file2));
20       StringBuffer c=new StringBuffer();
21       //将文件内容存入StringBuffer中
22       while((s = a.readLine()) != null) 
23       {
24             //用于拼接字符串
25             c.append(s);
26       }
27       //将StringBuffer转换成String,然后再将所有字符转化成小写字符
28       String m=c.toString().toLowerCase();
29       //匹配由数字和26个字母组成的字符串
30       String [] d=m.split(&quot;[^a-zA-Z0-9]+&quot;);
31       //遍历数组将其存入Map&lt;String, Integer&gt;中
32       Map&lt;String , Integer&gt; myTreeMap=new  TreeMap&lt;String, Integer&gt;();
33       for(int i = 0; i &lt; d.length; i++) {
34           //containsKey()方法用于检查特定键是否在TreeMap中映射
35             if(myTreeMap.containsKey(d[i])) {
36                 count = myTreeMap.get(d[i]);
37                 myTreeMap.put(d[i], count + 1);
38             }
39             else {
40                 myTreeMap.put(d[i], 1);
41             }
42         } 
43     //通过比较器实现排序
44       List&lt;Map.Entry&lt;String, Integer&gt;&gt; list = new ArrayList&lt;Map.Entry&lt;String, Integer&gt;&gt;(myTreeMap.entrySet());
45     //按降序排序
46       Collections.sort(list, new Comparator&lt;Map.Entry&lt;String, Integer&gt;&gt;() {
47           
48             public int compare(Entry&lt;String, Integer&gt; k1, Entry&lt;String, Integer&gt; k2) {
49                 //返回两个单词出现次数较多的那个单词的出现次数
50                 return k2.getValue().compareTo(k1.getValue());
51             }
52             
53         });
54        System.out.println(&quot;请输入要输出前N名的N&quot;);
55         n=input.nextInt();
56       for(Map.Entry&lt;String, Integer&gt; map : list) {
57             if(num &lt;= n) {
58                 //按内容输出到指定文件中去
59                 b.write(&quot;出现次数第&quot; + num + &quot;的单词为:&quot; + map.getKey() + &quot;,出现频率为&quot; + map.getValue() + &quot;次&quot;);
60                 //换行
61                 b.newLine();
62                 //输出到程序控制台
63                 System.out.println(map.getKey() + &quot;:&quot; + map.getValue());
64                 num++;
65             }
66             //输出完毕退出
67             else break;
68         }
69         //关闭文件指针
70         a.close();
71         b.close();
72     }
73     catch(FileNotFoundException e)
74     {
75         System.out.println(&quot;找不到指定文件&quot;);
76     }
77     catch(IOException e)
78     {
79         System.out.println(&quot;文件读取错误&quot;);
80     }
81     System.out.println(&quot;输出完成&quot;);
82 }
83 }

四、运行结果

1、程序结果

![]()

![]()

2.文件结果

![]()

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

声明:该文章系转载,转载该文章的目的在于更广泛的传递信息,并不代表本网站赞同其观点,文章内容仅供参考。

本站是一个个人学习和交流平台,网站上部分文章为网站管理员和网友从相关媒体转载而来,并不用于任何商业目的,内容为作者个人观点, 并不代表本网站赞同其观点和对其真实性负责。

我们已经尽可能的对作者和来源进行了通告,但是可能由于能力有限或疏忽,导致作者和来源有误,亦可能您并不期望您的作品在我们的网站上发布。我们为这些问题向您致歉,如果您在我站上发现此类问题,请及时联系我们,我们将根据您的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。