计算文件中与 String [ ] 中的单词匹配的单词

Posted

技术标签:

【中文标题】计算文件中与 String [ ] 中的单词匹配的单词【英文标题】:Count the words in a file that match the words in a String [ ] 【发布时间】:2017-03-24 23:50:49 【问题描述】:

我正在编写一个程序来读取文件并计算该文件中特定单词的出现次数。

我已经让代码工作到一定程度。我把我想计算的单词放在一个字符串 [] 中。问题是程序要么计算文件中所有单词的出现次数(包括我不想计算的单词),要么计算字符串 [] 中的单词。

如何让程序计算文件中与数组中的单词匹配的单词?我查看了许多类似的问题,并尝试使用 StringTokenizer 和 Lists,但也无法让它们完全正常工作。

我的目标是,如果我的文件有文本“黄色红色蓝色白色黑色紫色蓝色”,我希望我的输出是“红色:1,蓝色:2,黄色:1”

我只是想朝着正确的方向轻推,我知道我坚持这样做很愚蠢,而且一如既往,任何建设性的反馈都将受到赞赏。

到目前为止,这是我的代码:

static String[] words =  "red", "blue", "yellow", "green" ;

public static void main(String[] args) throws FileNotFoundException, IOException 

    System.out.println("This program will count the occurences of the specific words from a text file.");

    System.out.println("\nThe words to be counted are; red, blue, yellow, and green.\n");

    Map map = new HashMap();

    try (BufferedReader br = new BufferedReader(new FileReader("colours.txt"))) 

        StringBuilder sb = new StringBuilder();

        String line = br.readLine();

        while (line != null) 

            words = line.split(" "); // keeping this counts all words separated by whitespace, removing it counts words in my array instead of the file, so I'll get red: 1, blue: 1, yellow: 1 etc.,

            for (int i = 0; i < words.length; i++) 

                if (map.get(words[i]) == null) 

                    map.put(words[i], 1);
                

                else 

                    int newValue = Integer.valueOf(String.valueOf(map.get(words[i])));

                    newValue++;

                    map.put(words[i], newValue);
                

            

            sb.append(System.lineSeparator());

            line = br.readLine();
        
    

    Map<String, String> sorted = new TreeMap<String, String>(map);

    for (Object key : sorted.keySet()) 

        System.out.println(key + ": " + map.get(key));
    

【问题讨论】:

Files.lines(Paths.get("colours.txt")) .flatMap(Pattern.compile(" ")::splitAsStream) .filter(new HashSet&lt;&gt;(Arrays.asList(words))::contains) .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) .forEach((k, v) -&gt; System.out.println(k + ": " + v)); @ochi 这就是为什么我没有将其发布为答案。 @shmosel 你应该!!!它非常令人印象深刻(哦,它确实有效!!!刚刚尝试过;)) @shmosel 我可以理解这是如何工作的,但我还没有将其实现到我的代码中的知识。不过我会尝试:) 这就是整个代码。输入你的main() 就可以了。 【参考方案1】:

上面的主要问题是,当您拆分刚刚读取的行时,您正在覆盖初始数组或words

我已经写了这个(为了我自己的理解,稍微修改了变量名)

更新基于 cmets,感谢@shmosel)

public static void main(String[] args) throws FileNotFoundException, IOException 

    String[] keywords = "red", "blue", "yellow", "green";
    // for easier querying contents of array
    List keywordList = Arrays.asList(keywords);

    System.out.println("This program will count the occurrences of the specific words from a text file.");
    System.out.println("\nThe words to be counted are: " + keywordList + ".\n");

    Map<String, Integer> wordMap = new HashMap<>();

    try (BufferedReader br = new BufferedReader(new FileReader("/path/to/file/colours.txt"))) 
        // read a line
        String line = br.readLine();

        while (line != null) 
            // keeping this counts all words separated by whitespace, removing it counts words in my array instead
            // of the file, so I'll get red: 1, blue: 1, yellow: 1 etc.,
            String[] words = line.split(" ");

            for(String oneWord : words )
                if( keywordList.contains(oneWord))
                    // thanks @ shmosel for the improvement suggested in comments
                    wordMap.merge(oneWord, 1, Integer::sum);
                
            

            line = br.readLine();
        
    

    Map<String, Integer> sorted = new TreeMap<>(wordMap);

    for (Object key : sorted.keySet()) 
        System.out.println(key + ": " + wordMap.get(key));
    

【讨论】:

wordMap.merge(oneWord, 1, Integer::sum); 是的,当它向我指出时,我现在看到了,我的文件中的单词需要另一个数组。感谢您花时间向我展示如何实现代码,非常感谢。我将尝试弄清楚它现在是如何以及为什么起作用的:)【参考方案2】:

代码中可能有两个问题。

数组“单词”最初用于列出您感兴趣的单词。 但是您使用相同的数组来保存行中的单词。 [参见 words = line.split(" ");] 所以使用不同的数组来保存行中的单词。 不检查单词(在初始列表中)是否存在于 线。需要添加这个检查。另外,请记住,一个单词可以在同一行中重复多次。

【讨论】:

啊,这样的菜鸟错误 :) 感谢您的反馈,一旦我的代码工作,我会尝试合并检查。

以上是关于计算文件中与 String [ ] 中的单词匹配的单词的主要内容,如果未能解决你的问题,请参考以下文章

匹配两个 RDD [字符串]

查找和替换文件中与另一个文件中的字符串匹配的子字符串

删除文件中与模式不匹配的行

搜索字符串数组以找到匹配的单词之一

如何处理文件夹结构中与模式匹配的所有文件? [复制]

替换多个文件中的多个字符串