编写一个程序,程序实现对用户指定的文本文件中的英文字符和字符串的个数进行统计的功能,并将结果根据用户选择输出至结果文件或屏幕。 1) 构建统计类,该类实现对I/O的操纵;实现对文本文件中英文字符、字符串的统计;实现对统计结果的输出。 2) 构建测试类,该类实现与用户的交互,向用户提示操作信息,并接收用户的操作请求。
时间: 2024-02-20 18:58:04 浏览: 64
好的,这是一个典型的 Java 编程问题,需要编写两个类:一个是统计类,一个是测试类。以下是一个可能的解决方案:
```java
import java.io.*;
import java.util.*;
public class TextStatistics {
private String filename;
private int numChars;
private int numStrings;
private Map<String, Integer> stringCounts;
public TextStatistics(String filename) {
this.filename = filename;
this.numChars = 0;
this.numStrings = 0;
this.stringCounts = new HashMap<>();
}
public void count() throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(filename));
String line;
while ((line = reader.readLine()) != null) {
numChars += line.length();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken();
if (isString(token)) {
numStrings++;
Integer count = stringCounts.get(token);
if (count == null) {
count = 0;
}
stringCounts.put(token, count + 1);
}
}
}
reader.close();
}
private boolean isString(String str) {
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (!Character.isLetter(ch)) {
return false;
}
}
return true;
}
public void printResults(PrintStream output) {
output.println("Number of characters: " + numChars);
output.println("Number of strings: " + numStrings);
output.println("String counts:");
for (String str : stringCounts.keySet()) {
output.println(str + ": " + stringCounts.get(str));
}
}
}
```
这是一个统计类,它接受一个文件名并实现对文本文件中英文字符、字符串的统计。它使用 BufferedReader 读取文件并使用 StringTokenizer 分离单词。对于每个单词,它检查是否只包含字母,并根据需要更新字符串计数器。最后,它提供一个 printResults 方法,该方法将结果输出到指定的 PrintStream(可以是屏幕或文件)中。
接下来是测试类:
```java
import java.io.*;
import java.util.*;
public class TextStatisticsTest {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter the name of the input file: ");
String filename = scanner.nextLine();
TextStatistics stats = new TextStatistics(filename);
stats.count();
System.out.print("Enter 'S' to output to screen, 'F' to output to file: ");
String outputType = scanner.nextLine();
if (outputType.equalsIgnoreCase("S")) {
stats.printResults(System.out);
} else if (outputType.equalsIgnoreCase("F")) {
System.out.print("Enter the name of the output file: ");
String outputFilename = scanner.nextLine();
PrintStream output = new PrintStream(new File(outputFilename));
stats.printResults(output);
output.close();
} else {
System.out.println("Invalid output type.");
}
}
}
```
这个测试类与用户交互,提示用户输入文件名和输出类型,并创建 TextStatistics 实例来执行统计。如果用户选择将结果输出到屏幕,则调用 printResults 方法并传递 System.out 作为参数。如果用户选择将结果输出到文件,则提示用户输入输出文件名,并创建一个新的 PrintStream 来写入该文件。如果用户输入了无效的输出类型,则输出错误消息。
以上是一个可能的解决方案,但并不是唯一的解决方案。编程是一门艺术,可以用多种方式实现同一功能。
阅读全文