【Java实验】文件中单词重复字母对的查找
一、实验目的
掌握文件输入流和输出流对文件进行读写的方法和步骤。掌握字符串处理的常用方法,掌握文件处理过程中年异常处理的方法。
二、实验性质
设计性
三、实验内容
在 words.txt 文件中包含了 87314 个单词,每个单词占一行(以回车结尾),编写 Java 程序从 words 文件中读取单词,并输出重复字母对最多的单词,如果有多个单词是最多字母对单词输出第一个。例如 tooth 这个单词有一个重复字母对,committee 有三个重复字母对。
要求要写注释,能够生成 Javadoc。
四、实验环境
1.计算机一台;
2.中文 Windows 操作系统;安装 JDK1.6 以上版本,安装 EclipseIDE 软件。
五、实验主要步骤
1.问题分解
实验类图如图所示,可通过 number 记录最大重复字母对的个数,通过 result 记录第一个拥有最大重复字母对的单词,getWords 获取文件中的单词,choose 选择是否是所需结果,count 记录重复字母对的个数,write 将结果写入文件。
2.给出程源代码
import java.io.*;
/** * 查找单词表中的重复字母对,并输出重复字母最多的单词,如果有多个重复次数相同的单词,输出第一个单词 * */
public class RepeatedCharCount
{
public static void main(String[] args)
{
String name = "words.txt";//传入文件名
RepeatedCharCount result = new RepeatedCharCount();
result.getWords(name);//输出结果
}
/** * 标记重复单词的个数 * */
private static int number;
/** * 记录第一个重复字母对最多的单词 * */
private static String result;
/** * @param fileName * String类,要读取字符串的文件名 输入一个当前目录下的文件名,对其中的字符串进行读取 * */
public static void getWords(String fileName)
{
File file = new File(fileName);
try
{
FileReader reader = new FileReader(file);
@SuppressWarnings("resource")
BufferedReader buffer = new BufferedReader(reader);
String word = new String();
while ((word = buffer.readLine()) != null) {
choose(word);
}
System.out.println("第一个重复字母对最多的单词是:\n" + result + "\n重复字母对个数:\n"
+ number);
}
catch (IOException e)
{
System.out.println(e);
}
}
/** * @param word * 要判断的单词 输入一个读取到的字符串,判断该字符串的重复字母对是否是最多的,以及是否是第一个拥有最多重复字母对的单词 * */
private static void choose(String word)
{
int current = count(word);
if (current > number)
{
number = current;
result = word;
File file = new File("result.txt");
file.delete();
}
if (current == number)
{
writeWords(word);
}
}
/** * @param word * 要查找重复字母对的单词数 * @return sum 当前单词里重复字母对的个数 有几个重复字母对,返回重复字母对的个数 * */
public static int count(String word)
{
int sum = 0;
for (int i = 0; i < word.length() - 1; i++)
{
if (word.charAt(i) == word.charAt(i + 1))
{
sum++;
}
}
// System.out.println(sum);
return sum;
}
/** * @param word * 读取要写入的字符串 将重复字母对最多的单词写入文件 * */
private static void writeWords(String word)
{
try
{
File file = new File("result.txt");
FileWriter newFile = new FileWriter(file, true);
BufferedWriter writer = new BufferedWriter(newFile);
writer.write(word);
writer.newLine();
writer.flush();
writer.close();
}
catch (IOException e)
{
System.out.println(e);
}
}
}
这个地方要注意,main方法里面最开始定义的那个 name后跟的是源文件存的位置,getWords()方法里也是从这个位置开始读的,如果没有words.txt文件,可以在整个项目最上一层新建一个txt文件改名成words.txt。里面的内容就是一个单词一行,回车结尾(整个文件的最后一行也是回车)。如果没把这个文件放在项目的最上一层,需要在后面的字符串上写上完整的绝对地址。
在下面的方法里面查完之后默认把结果写在了result.txt中,这个文件也是在整个项目最上层的文件夹里,刷新一下就能看见。
刚开始的时候没有result.txt文件,会自动创建一个,以后每次运行程序,新的结果都会追加在最开始的文件后面。
这个getWords()方法和writeWords()方法就是最基本的对文件流的读取操作,然后其实也有一些问题,比如流的开启关闭什么的,但是在小项目里面和这两个方法很好用的,我后面做其他项目需要输入输出不让从控制台走的时候,几乎都是直接把这两个方法粘过来的。
整个程序最后运行的结果是这样的:
这个测验用的words.txt是我随便创建的,内容在上面打开了,左边包结构能看见输入输出两个文件的位置,右边最下面控制台就是最后输出的结果。
关于这个txt文件的位置,最简单粗暴的办法,就是直接在电脑上打开创建项目的文件夹,然后把txt文件粘贴或者创建在里面。或者在编译软件里,右键点击创建的project的名字(上面图里是test),然后新建一个txt文件夹,把相关格式的单词粘进去就好了或者先复制那个文件,右键点击project名字然后粘贴也可以。
文件流在读取的时候,默认是从最上面一层文件开始找,如果只写文件名的话,就会认为这个文件在整个文件夹的最上面一层(整个project所在的文件夹),如果txt被放在了其他地方,系统是找不到的,会报 java.io.FileNotFoundException这个错,把文件夹移动到最上面一层就好了(不是在src包里!)。
如果一定要写在src包里,需要写绝对地址,比如/src/words.txt这种。
原文地址: https://blog.csdn.net/z1446731325/article/details/100625001
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
相关文章