在java中计算句子中每个单词的频率

新手上路,请多包涵

我正在编写一个非常基本的 Java 程序,用于计算句子中每个单词的频率,到目前为止,我设法做了这么多

import java.io.*;

class Linked {

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

        BufferedReader br = new BufferedReader(
            new InputStreamReader(System.in));
        System.out.println("Enter the sentence");
        String st = br.readLine();
        st = st + " ";
        int a = lengthx(st);
        String arr[] = new String[a];
        int p = 0;
        int c = 0;

        for (int j = 0; j < st.length(); j++) {
            if (st.charAt(j) == ' ') {
                arr[p++] = st.substring(c,j);
                c = j + 1;
            }
        }
    }

    static int lengthx(String a) {
        int p = 0;
        for (int j = 0; j < a.length(); j++) {
            if (a.charAt(j) == ' ') {
                p++;
            }
        }
        return p;
    }
}

我已经提取了每个字符串并将其存储在一个数组中,现在问题实际上是如何计算每个“单词”重复的实例数以及如何显示以便重复的单词不会多次显示,你能帮我吗一 ?

原文由 Sigma 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 356
2 个回答

使用以单词为键的地图并计为值,像这样

    Map<String, Integer> map = new HashMap<>();
    for (String w : words) {
        Integer n = map.get(w);
        n = (n == null) ? 1 : ++n;
        map.put(w, n);
    }

如果您不允许使用 java.util 那么您可以使用一些排序算法对 arr 进行排序并执行此操作

    String[] words = new String[arr.length];
    int[] counts = new int[arr.length];
    words[0] = words[0];
    counts[0] = 1;
    for (int i = 1, j = 0; i < arr.length; i++) {
        if (words[j].equals(arr[i])) {
            counts[j]++;
        } else {
            j++;
            words[j] = arr[i];
            counts[j] = 1;
        }
    }

自 Java 8 以来使用 ConcurrentHashMap 的有趣解决方案

    ConcurrentMap<String, Integer> m = new ConcurrentHashMap<>();
    m.compute("x", (k, v) -> v == null ? 1 : v + 1);

原文由 Evgeniy Dorofeev 发布,翻译遵循 CC BY-SA 3.0 许可协议

在 Java 8 中,您可以用两行简单的代码来编写它!此外,您还可以利用并行计算。

这是执行此操作的最漂亮的方法:

 Stream<String> stream = Stream.of(text.toLowerCase().split("\\W+")).parallel();

Map<String, Long> wordFreq = stream
     .collect(Collectors.groupingBy(String::toString,Collectors.counting()));

原文由 Bahul Jain 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题