问题删除标点符号和大写字母

时间:2015-12-09 19:49:34

标签: java text

我正在尝试读取文本文件并创建具有唯一字词及其频率的哈希映射。我搜索了一种删除标点符号的方法并尝试实现它,但它似乎并没有起作用。

我尝试在第四行代码中使用以下内容: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;等等的计数中

感谢您的帮助!

2 个答案:

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

免责声明:代码可能无法编译或工作,因为它在我的手机上被翻阅(但它有合理的可能性)