Java 打印文本文件中每个单词和行号的计数
好吧,这让我困惑了好几天,我需要从一个文本文件中读取并打印出每个单词出现的时间,我成功地做到了这一点,但我还需要打印出每个单词出现的行数,这就是我在某个时刻被卡住的地方,我不需要一个直接的解决方案,因为我想自己解决它,但我需要一些关于我应该从哪里开始或下一步做什么的帮助Java 打印文本文件中每个单词和行号的计数,java,data-structures,Java,Data Structures,好吧,这让我困惑了好几天,我需要从一个文本文件中读取并打印出每个单词出现的时间,我成功地做到了这一点,但我还需要打印出每个单词出现的行数,这就是我在某个时刻被卡住的地方,我不需要一个直接的解决方案,因为我想自己解决它,但我需要一些关于我应该从哪里开始或下一步做什么的帮助 import java.io.*; import java.util.Scanner; import java.util.*; public class PrintWordCounts { public static
import java.io.*;
import java.util.Scanner;
import java.util.*;
public class PrintWordCounts {
public static void main(String[] args) {
AVLTree<Word> tree = new AVLTree<Word>();
try {
Scanner reader = new Scanner(new File("AboutJUC.txt"));
reader.useDelimiter("[\\p{Punct}\\s]+");
while (reader.hasNextLine()){
String s = reader.nextLine();
String[] words = s.split("\\s");
int countLine;
Word target = new Word(reader.next());
Word result = tree.search(target);
if ( result != null )
result.count++;
else
tree.insert(target);
}
reader.close();
} catch (IOException ex) {
System.out.println("File Error");
}
tree.inorder();
}
}
import java.io.*;
导入java.util.Scanner;
导入java.util.*;
公共类PrintWordCounts{
公共静态void main(字符串[]args){
AVLTree树=新的AVLTree();
试一试{
扫描仪阅读器=新扫描仪(新文件(“AboutJUC.txt”);
reader.useDelimiter(“[\\p{Punct}\\s]+”;
while(reader.hasNextLine()){
字符串s=reader.nextLine();
字符串[]字=s.split(\\s”);
整数计数线;
单词目标=新词(reader.next());
Word result=tree.search(目标);
如果(结果!=null)
结果:count++;
其他的
插入(目标);
}
reader.close();
}捕获(IOEX异常){
System.out.println(“文件错误”);
}
tree.inoorder();
}
}
这就是我正在使用的类这个词
import java.util.LinkedList;
public class Word implements Comparable<Word> {
public String word;
public int count;
private LinkedList<Integer> lines = new LinkedList<Integer>();
public int lineCount;
public Word(String w) {
word = w;
count = 1;
lineCount = 1;
}
public boolean equals(Object obj) {
Word other = (Word) obj;
return word.equals(other.word);
}
public int compareTo(Word obj) {
int comparedValue = word.compareTo(obj.word);
while(comparedValue == 0){
System.out.print(lineCount);
lineCount++;
}
return word.compareTo(obj.word);
}
public String toString() {
return word+"\t"+count + "\t" + "[" + lineCount + "]";
}
}
import java.util.LinkedList;
公共类Word实现了可比较的{
公共字符串;
公共整数计数;
私有LinkedList行=新建LinkedList();
公共整数行计数;
公共字(字符串w){
字=w;
计数=1;
行数=1;
}
公共布尔等于(对象obj){
单词other=(单词)obj;
返回单词.equals(其他单词);
}
公共整数比较(Word obj){
int comparedValue=word.compareTo(obj.word);
while(comparedValue==0){
系统输出打印(行数);
lineCount++;
}
返回单词compareTo(obj.word);
}
公共字符串toString(){
返回单词+“\t”+count+”\t“+”[“+lineCount+”]”;
}
}
首先,在比较中去掉无限循环。您需要在解决方案中使用两个循环,一个用于行,另一个用于嵌套一行中的单词。字典比树更合适。在外部循环中,createdictionary可在离开内部循环时计算一行中的单词数,并对该字典中的单词按1更新行中的用法数。我想应该有足够的信息来完成任务。步骤1:添加行号计数器。让我们称之为lineNum
。在逐行读取的循环外部初始化它。读取一行后,增加其值
步骤2:在Word
中添加一个方法来添加行号,我们称之为addLineNum
。首次向树中添加单词时,以及在更新现有单词时,请将此方法与lineNum
配合使用,如下所示:
if (result != null) {
result.addLineNum(lineNum);
} else {
target.addLineNum(lineNum);
tree.insert(target);
}
步骤3:由于每行有多个单词,您甚至创建了单词,
您将需要一个嵌套循环来查找这些单词
第四步:小心行号添加和匹配字计数。匹配的字可能多于行。由于一行可以多次包含一个字,因此仍然需要计数。谢谢您的帮助,但我不应该在main中使用Step2吗?@Chsz该方法需要在word
中,因为它是word实例的特定状态。或者,我不知道你的意思…非常感谢你,但我不知道如何使用HashMap@Chsz你知道如何使用哈希映射了吗?我错过了你的评论。。实际上,字典和散列集在Java方面是相同的。所以我更新了我的答案。可以将表示单词的字符串用作键,也可以将其用作word类型的值对象。使用dict比使用tree工作得更快。