我正在尝试读取文本文件并创建具有唯一字词及其频率的哈希映射。我搜索了一种删除标点符号的方法并尝试实现它,但它似乎并没有起作用。
我尝试在第四行代码中使用以下内容:line = line.replaceAll(" \ p {Punct} +","");
我错过了什么吗?
try (BufferedReader br = new BufferedReader(new FileReader("Book 1 A_Tale_of_Two_Cities_T.txt"))) {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
line = line.replaceAll("\\p{Punct}+", "");
while (line != null) {
String[] words = line.split(" ");//those are your word
for (int i = 0; i < words.length; i++) {
if (m1.get(words[i]) == null) {
m1.put(words[i], 1);
} else {
int newValue = Integer.valueOf(String.valueOf(m1.get(words[i])));
newValue++;
m1.put(words[i], newValue);
}
}
sb.append(System.lineSeparator());
line = br.readLine();
}
}
Map<String, String> sorted = new TreeMap<>(m1);
for (Object key : sorted.keySet()) {
System.out.println("Word: " + key + "\tCounts: " + m1.get(key));
}
我期待的输出看起来像这样:
Word:有计数:279
Word:因此计数:1
单词:这些计数:156
问题在于我也将此作为输出:
字:这些,计数:3
字:这些。计数:2
字:这些。'计数:1
我希望从单词的结尾(和开头)删除标点符号,并将它们添加到&#34;这些&#34;等等的计数中
感谢您的帮助!
答案 0 :(得分:0)
阅读第一行后,您正在运行replaceAll
:
String line = br.readLine();
line = line.replaceAll("\\p{Punct}+", "");
所以第一行不会有任何标点符号。但是,你进入这个while循环:
while (line != null) {
...
line = br.readLine();
}
所以循环中没有replaceAll
。最后你读了另一行。然后你循环回while
。由于循环内部没有替换,第二行和后面的行将保留标点符号。
替换应该在内部循环中完成。此外,在您阅读第一行之后不应该立即完成,因为理论上第一行可能是null
(如果文件为空)。
所以你应该做的是在你验证该行不为空之后在循环内完成:
String line = br.readLine();
while (line != null) {
line = line.replaceAll("\\p{Punct}+", "");
...
line = br.readLine();
}
现在,它测试该行是否为null,然后替换其中的标点符号。由于替换是在while
内完成的,因此它也将应用于第二行及其后的行。
答案 1 :(得分:0)
正如RealSkeptic指出的那样,你需要将正则表达式替换为在循环中。
还有其他几个&#34;问题&#34;使用你的代码,但主要的问题是它有这么多。
在这里,您可以在一条(虽然很长)的线上做到这一点:
Files.lines(Paths.get("Book 1 A_Tale_of_Two_Cities_T.txt")
.map(s -> s.replaceAll("\\p{Punct}", "").toLowerCase()))
.flatMap(s -> Arrays.stream(s.split("\\s+")))
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting())
.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.forEach((k, v) -> System.out.println("Word: " + v + "\tCounts: " + v));
免责声明:代码可能无法编译或工作,因为它在我的手机上被翻阅(但它有合理的可能性)