【问题标题】:Input/Output blank space输入/输出空格
【发布时间】:2020-06-06 16:00:28
【问题描述】:

在这段代码中,我从一个文件中获取所有单词并计算它们。之后,将它们及其频率写入文件。

这段代码正在做我想要的,但另外它也会计算所有空格并将它们写入文件。我怎么能不包括他们?

            String line;

            BigDecimal count = new BigDecimal(0);

            ArrayList<String> words = new ArrayList<String>();

            Pattern pattern = Pattern.compile("[^a-zA-Z]", Pattern.CASE_INSENSITIVE);

            while ((line = reader.readLine()) != null) {

                String string1 = line.toLowerCase();

                String string[] = pattern.split(string1);
                for (String s : string) {
                    words.add(s);
                }
            }
            Map<String, BigDecimal> map = new HashMap<String, BigDecimal>();

            for (String s : words) {
                BigDecimal x = new BigDecimal(1);
                if (map.containsKey(s)) { 
                    count = map.get(s);
                    map.put(s, count.add(x));
                } else if (!map.containsKey(s)) {
                    map.put(s, x);

                }
            }

            Map<String, BigDecimal> wordHistogram = map;

            List<Entry<String, BigDecimal>> sortedWordHistogram = new LinkedList<Entry<String, BigDecimal>>(
                    wordHistogram.entrySet());
            Collections.sort(sortedWordHistogram, (o1, o2) -> o2.getValue().compareTo(o1.getValue()));


            Map<String, BigDecimal> inTxt = map;

            for (Entry<String, BigDecimal> entry : sortedWordHistogram) {
                inTxt.put(entry.getKey(), entry.getValue());
                writer.write(entry.getKey() + " : " + entry.getValue() + "\n");
            }

我相信它已经足够高效了,但任何让它变得更好或更高效的调整都是令人高兴的。

【问题讨论】:

  • 在编辑中删除了所有代码,这使得现有答案难以理解。

标签: java input output


【解决方案1】:

只需将您的正则表达式 ([^a-zA-Z]) 替换为 \\s+

这将确保在分割一行时考虑单词之间的所有空格。

此外,您可以通过替换以下行来进一步简化代码:

Pattern pattern = Pattern.compile("[^a-zA-Z]", Pattern.CASE_INSENSITIVE);

while ((line = reader.readLine()) != null) {

    String string1 = line.toLowerCase();

    String string[] = pattern.split(string1);
    for (String s : string) {
        words.add(s);
    }
}

while ((line = reader.readLine()) != null) {
    String string[] = line.trim().toLowerCase().split("\\s+");
    for (String s : string) {
        words.add(s);
    }
}

请注意,我还使用了trim(),以便在拆分之前从行中删除前导和尾随空白字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 2021-09-04
    相关资源
    最近更新 更多