我是Java新手。 我编写了一个代码来计算文件中特定单词的出现次数。要向用户询问要计算的单词。我写了两个代码。第一个代码运行正常,计数正确。而在第二个代码中,计数较少。我无法弄清楚原因。有人可以帮我找到第二个代码中的缺陷吗?
从文件中读取的段落和两个代码如下所示。
段落:
在文字处理和桌面发布中,硬回车或分段符表示新段落,以区别于段落内部行末尾的软回车。这种区别允许自动换行在编辑时自动重新流动文本,而不会丢失分段符。软件可以在段落中应用垂直空格或缩进,具体取决于所选的样式。
实际存储此类文档的方式取决于文件格式。例如,HTML使用
标记作为段落容器。在纯文本文件中,有两种常见格式。预格式化文本将在每个物理行的末尾添加换行符,并在段落末尾添加两个换行符,从而创建一个空行。另一种方法是只在每个段落的末尾添加换行符,并将自动换行显示在显示或处理文本的应用程序中(如果有必要的话)。
代码1:提供正确的输出
package prac3;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
public class FromFile {
private String word;
FromFile() {
}
int Count(String word1) throws IOException {
this.word = word1;
String abc;
int count = 0, total = 0;
try {
BufferedReader in = new BufferedReader(
new FileReader(
"C:\\Documents and Settings\\Administrator.EGOVPC79\\Desktop\\file.txt"));
while ((abc = in.readLine()) != null) {
String abc1 = abc;
Scanner s = new Scanner(abc1);
while (s.hasNext()) {
total++;
if (s.next().equals(word)) {
count++;
}
}
}
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
System.out.println("total" + total);
return count;
}
public static void main(String[] args) throws IOException {
FromFile obj = new FromFile();
String word;
Scanner abc = new Scanner(System.in);
System.out.println("Enter the word you want to count");
word = abc.nextLine();
int count = obj.Count(word);
System.out.println("The occurence is :" + count);
}
}
代码2:这会产生错误的输出。
package prac3_2;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
public class File {
private String word;
private String abc1;
File() throws IOException {
String abc;
BufferedReader in = new BufferedReader(
new FileReader(
"C:\\Documents and Settings\\Administrator.EGOVPC79\\Desktop\\file.txt"));
while ((abc = in.readLine()) != null) {
abc1 = abc;
System.out.println(abc1);
}
in.close();
}
int Count(String word1) {
this.word = word1;
int count = 0, total = 0;
Scanner s = new Scanner(abc1);
while (s.hasNext()) {
total++;
if (s.next().equals(word)) {
count++;
}
}
System.out.println("total" + total);
return count;
}
public static void main(String[] args) throws IOException {
File obj = new File();
String word;
Scanner abc = new Scanner(System.in);
System.out.println("Enter the word you want to count");
word = abc.nextLine();
int count = obj.Count(word);
System.out.println("The occurence is :" + count);
}
}
答案 0 :(得分:1)
问题是abc1没有所有文本,并且在计数时,它仅在它读取的最后一行中计算所提供的单词(存储在abc1中)
在读取文件时使用StringBuilder,追加读取文件的每一行将使计数逻辑工作。
private StringBuilder abc1 = new StringBuilder();
....
....
abc1.append(abc);
...
...
Scanner s = new Scanner(abc1.toString());
这将读取整个文本并扫描单词
答案 1 :(得分:0)
我是File
String abc;
while((abc = in.readLine()) != null)
{
abc1=abc;
System.out.println(abc1);
}
in.close();
您在aloop中读取了孔文件,但只保存了成员变量abc1
中的最后一行
以后的计数仅在最后一行进行。
您可能希望将membervariable更改为List<String>
,您可以在其中添加在构造函数中读取的行。在计数中,您可以迭代该列表并计算每个列表元素中的单词。