【问题标题】:How to find on which line a word is in Java如何在Java中找到单词在哪一行
【发布时间】:2015-03-10 00:12:12
【问题描述】:

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

    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);

【问题讨论】:

    标签: java hashmap bufferedreader filereader


    【解决方案1】:

    它是每一行的附加信息。您只需要每行的计数信息,因此简单的 Map 是不够的,您需要每行 Map 的 Map。

    有两种基本方法:

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

    第一行根据整数键值创建 Map 的 Map - 这将是行。

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

    我会推荐第二行。

    您还需要稍微修改一下您的 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);
        }
    }
    

    【讨论】:

    • 感谢您的帮助!由于我对数据结构很陌生,请您给我一个示例或伪代码来说明如何工作?
    • 我明白了!如果我想让它按字显示而不是按行显示:“word”在“line1”中出现“X”次,在“line1”中出现“Y”次,在“line2”中出现“Z”次,那会怎样?我是否需要使用地图列表才能做到这一点?
    • @deadpixels - 你需要两者,你想出的解决方案对“wordwise”有好处,我向你展示了“linewise”。您可以在该循环中使用不同的名称计算这两个变量(获取逐行变量和逐字变量),也可以从逐行变量中计算。 (我更喜欢第一个选项,它更简单)。
    【解决方案2】:

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

    您已从 bufferedReader 中读取该行

    String line = buffer.readLine();
    

    然后在你的循环中你有

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

    countNumberOfTimesInALinereceives 原始行和单词 your 算作参数。要使用它,您还应该像这样声明一个类变量: 私有静态 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类似问题的答案

    【讨论】:

      猜你喜欢
      • 2013-05-13
      • 2014-04-21
      • 1970-01-01
      • 1970-01-01
      • 2022-07-07
      • 1970-01-01
      • 2014-10-16
      • 2021-05-30
      • 1970-01-01
      相关资源
      最近更新 更多