如何在Java中查找单词的哪一行

时间:2015-03-10 00:12:13

标签: java hashmap bufferedreader filereader

我正在尝试创建一个程序,用于计算单词在文本中出现的次数,并告诉您每行出现的次数。我已经设法找到单词出现的次数和文本中的行数,但我找不到单词出现在哪行以及多少次。请你帮助我好吗?到目前为止,这是我的代码:

    FileReader file = new FileReader("C:/Users/User/Desktop/test.txt");
    BufferedReader buffer = new BufferedReader(file);

    String line = buffer.readLine();
    Map<String, Integer> hash = new HashMap<String, Integer>();
    int counter = 0; //number of lines

    while (line != null){
        String[] words = line.split(" ");

        for (String s : words) {
            Integer i = hash.get(s);
            hash.put(s, (i==null)? 1: i+1);
        }

        line = buffer.readLine();
        counter = counter + 1;           
    }

System.out.println(hash);
System.out.println(counter);

2 个答案:

答案 0 :(得分:1)

这是每行的附加信息。你只需要在每一行上都有一个计数信息,因此简单的Map是不够的,你需要每行的Map Map。

有两种基本方法:

    Map<Integer, Map<String, Integer>> hashOfHash = new HashMap<>();
    List<Map<String, Integer>> list = new ArrayList<>();

第一行根据整数键值创建地图的地图 - 这就是行。

第二行是创建地图列表,因为存储了列表中的顺序,现在可以通过迭代它来到哪一行。

我会推荐第二行。

您还需要稍微修改您的while循环,以便为每一行创建新的地图(考虑一下,您需要像在第一行那样做)。


例如,这应该与您的程序相同,但它会显示每行的结果:

public static void main(String[] args) throws FileNotFoundException, IOException {
    FileReader file = new FileReader("C:/Users/User/Desktop/test.txt");
    BufferedReader buffer = new BufferedReader(file);

    String line = buffer.readLine();

    List<Map<String, Integer>> list = new ArrayList<>();

    while (line != null) {
        Map<String, Integer> hash = new HashMap<String, Integer>();
        String[] words = line.split(" ");

        for (String s : words) {
            Integer i = hash.get(s);
            hash.put(s, (i == null) ? 1 : i + 1);
        }

        line = buffer.readLine();
        list.add(hash);
    }

    int i=0;
    for (Map<String, Integer> mapAtRow : list) {
        i++;
        System.out.println("at row " + i + "we found this: " + mapAtRow);
    }
}

答案 1 :(得分:0)

这是一个递归方法,允许您使用String.indexOf计算单词出现在一行中的次数。

您已从bufferedReader

中读取该行
String line = buffer.readLine();

然后在你的循环中你有

 for (String s : words) {
    int numberOfOccurencesOfS = countNumberOfTimesInALine(line,s);        
 } 

countNumberOfTimesInALine接收原始行和您计算的单词作为参数。要使用它,您还应该声明一个类变量,如下所示:     private static int numberOfLineOccurences;

这是方法

public static int countNumberOfTimesInALine(String line, String word) {
    if (line.indexOf(word) == -1) {
        return numberOfLineOccurences;
    } else {
        numberOfLineOccurences++;
        if (line.indexOf(word) + word.length() >  line.length() -1     ) {
            return numberOfLineOccurences;
        }
        return countNumberOfTimesInALine(
                line.substring(line.indexOf(word) + word.length()), word );
    }

}

以下是一个用法示例:

String line = "DEMO TEST DEMO TEST DEMO TEST ALPHA BETA GAMMA";
System.out.println("Number of occurences of TEST is " + countNumberOfTimesInALine(line, "TEST"));

结果如下

  

TEST的出现次数是3

我已发布与您here

类似问题的答案