【Java实验】文件中单词重复字母对的查找

一、实验目的

掌握文件输入流和输出流对文件进行读写的方法和步骤。掌握字符串处理的常用方法,掌握文件处理过程中年异常处理的方法。

二、实验性质

设计性

三、实验内容

在 words.txt 文件中包含了 87314 个单词,每个单词占一行(以回车结尾),编写 Java 程序从 words 文件中读取单词,并输出重复字母对最多的单词,如果有多个单词是最多字母对单词输出第一个。例如 tooth 这个单词有一个重复字母对,committee 有三个重复字母对。
要求要写注释,能够生成 Javadoc。

四、实验环境

1.计算机一台;
2.中文 Windows 操作系统;安装 JDK1.6 以上版本,安装 EclipseIDE 软件。

五、实验主要步骤

1.问题分解

实验类图如图所示,可通过 number 记录最大重复字母对的个数,通过 result 记录第一个拥有最大重复字母对的单词,getWords 获取文件中的单词,choose 选择是否是所需结果,count 记录重复字母对的个数,write 将结果写入文件。

【Java实验】文件中单词重复字母对的查找_第1张图片

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()方法就是最基本的对文件流的读取操作,然后其实也有一些问题,比如流的开启关闭什么的,但是在小项目里面和这两个方法很好用的,我后面做其他项目需要输入输出不让从控制台走的时候,几乎都是直接把这两个方法粘过来的。
整个程序最后运行的结果是这样的:
【Java实验】文件中单词重复字母对的查找_第2张图片
这个测验用的words.txt是我随便创建的,内容在上面打开了,左边包结构能看见输入输出两个文件的位置,右边最下面控制台就是最后输出的结果。
关于这个txt文件的位置,最简单粗暴的办法,就是直接在电脑上打开创建项目的文件夹,然后把txt文件粘贴或者创建在里面。或者在编译软件里,右键点击创建的project的名字(上面图里是test),然后新建一个txt文件夹,把相关格式的单词粘进去就好了或者先复制那个文件,右键点击project名字然后粘贴也可以。
文件流在读取的时候,默认是从最上面一层文件开始找,如果只写文件名的话,就会认为这个文件在整个文件夹的最上面一层(整个project所在的文件夹),如果txt被放在了其他地方,系统是找不到的,会报 java.io.FileNotFoundException这个错,把文件夹移动到最上面一层就好了(不是在src包里!)。
如果一定要写在src包里,需要写绝对地址,比如/src/words.txt这种。

你可能感兴趣的:(Java,程序,Java实验)