【发布时间】:2021-01-10 05:12:46
【问题描述】:
我正在遍历几个文本文件,并试图在所有文本文件中找到前 20 个单词。我设法设置了一些代码来查找单个文件中的前 20 个单词。但是,现在我正在为几个文件而苦苦挣扎。
我有一个全局链接哈希图,我想在其中存储我在文本文件中遇到的每个新单词(作为键),并且我想在遇到更多时更新它的值(它出现的次数)这个词的。例如,在第一个文件中,我找到了 8000 个单词“the”的实例,在下一个文件中,我在另一个文件中遇到了 7000 个“the”实例,然后我希望将键“the”的值更新为 15000 .
这是我的代码:
import java.util.*;
import java.util.stream.Collectors;
import java.io.IOException;
import java.nio.file.*;
import java.util.Map.Entry;
import java.util.function.Function;
import java.io.File;
import java.nio.charset.StandardCharsets;
public class FileReaderTwo
{
static LinkedHashMap<String, Long> top20Words = null;
public static void main(String args[])
{
File dir = new File("data/");
for (File file : dir.listFiles())
{
try
{
top20Words = Files.lines(Paths.get(file.toString()), StandardCharsets.ISO_8859_1)
.flatMap(line -> Arrays.stream(line.toLowerCase().split("[\\(,\\).\\s+]+")))
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting())).entrySet().stream()
.sorted(Entry.comparingByValue(Comparator.reverseOrder()))
.sorted(Map.Entry.<String, Long>comparingByValue().reversed())
.collect(Collectors.toMap(Entry::getKey, Entry::getValue, (u, v) -> u, LinkedHashMap::new));
} catch (IOException e)
{
e.printStackTrace();
}
}
System.out.println(top20Words);
}
}
注意:我知道在它打印出每个单词的那一刻,我想先处理这个问题,然后再修复它。
【问题讨论】:
-
你确定你想要
+inside正则表达式中的字符类吗?[\(,\).\s+]+? --- 另外,括号在字符类中并不特殊,因此不需要转义。我想你的意思只是[(),.\s]+。 --- 也许您想要除'和-之外的所有非字母字符?如果是这样,请指定要保留的字符,然后否定它,例如[^\p{L}\p{N}'\-]+
标签: java sorting collections io linkedhashmap