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工作得更快。