java计算字符串中二元组的数量

标签 java

我有以下方法可以创建输入的二元组。我需要计算二元组的数量来计算每次出现的概率。

public static String sortCountBigrams(ArrayList<String> bigrams) {
    String outputResult = "";
    Collections.sort(bigrams);
    String curr = bigrams.get(0);
    int counter = 1;
    for (String next : bigrams) {
        if (next.equals(curr)) {
            counter++;
        } else {
            outputResult += curr + " " + Double.toString(counter) + " ";
            counter = 1;
            curr = next;
        }
    }
    return outputResult; 

}

这是二元组的示例输出,如下所示:

af 22 ag 22 ah 7 ai 53 aj 74 ak 1 al 384 am 157

我需要将计算(如下)添加到方法中,java库中是否有一个函数可以在二元组中的元素数量不是常量的情况下执行此操作。

af 22/8 ag 22/8 ah 7/8 ai 53/8 aj 74/8 ak 1/8 al 384/8 am 157/8

提前致谢。

最佳答案

第一个可以收集每个二元组的计数:

Map<String, Long> counts = bigrams().stream()
    .collect(Collectors.groupingBy(Function.identity(), Collectors.counting());
double denominator = counts.size(); // Really not bigrams.size()?

按照要求,我已将分母设置为不同二元组的数量,而不是所有二元组的数量(这将给出频率表)。

Map<String, Double> results = new LinkedHashMap<>();
counts.entrySet().stream()
    .sorted(Map.Entry.<String, Long>comparingByValue().reversed()
        .thenComparing(Map.Entry.<String, Long>comparingByKey()))
    .forEachOrdered(e -> results.put(e.getKey(), e.getValue() / denominator));

System.out.println(results);

通过使用 LinkedHashMap,可以保持插入到映射中的顺序。 作为排序顺序,我首先选择最常见的,然后按双字母组文本。

我立即将分母设为 double ,以便进行浮点除法,而不是整数除法。

虽然流表示法的语法很苛刻,但它非常紧凑。

关于java计算字符串中二元组的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55178776/

相关文章:

java - Dropwizard bean 验证不起作用

java - 如何避免 Diffie-Hellman 与 Java/Netty 的 SSL 连接?

java - 是否有适用于 Torque/PBS 的 DRMAA Java 库?

java - 在 JLabel 中用 int 换行的问题

java - 使用 Gmail API 发送电子邮件时出错?

java - 像素点,桌面和安卓

Java 8 查找最大值

java - 从底层 InputStream 解析时,Jackson 如何处理流结束读取(例如 -1、EOF)

java - ServiceMix (FuseESB) - 无法使用 AggregationStrategy 部署服务单元

java - 如何使用 Stanford CoreNLP Coreferences 模块通过最具代表性的提及来替换单词