java - 最频繁的元素流

标签 java java-stream frequency

如何找到最频繁的元素,但当最频繁的元素很少时返回null。

我想找到相当于以下内容的代码:

public static void main(String[] args) {
    System.out.println("Should return A -> " + mostFrequent(Arrays.asList("A", "A", "B")));
    System.out.println("Should null as element in list have same frequency -> "
            + mostFrequent(Arrays.asList("A", "B")));
}

private static String mostFrequent(List<String> elements) {
    Map<String, Long> ordered = new TreeMap<>();
    for (String e : elements) {
        if (!ordered.containsKey(e)) {
            ordered.put(e, 0L);
        }
        Long tmp = ordered.get(e);
        ordered.put(e, ++tmp);
    }

    String mostFrequent = null;
    long i = 0;
    Iterator<Map.Entry<String, Long>> it = ordered.entrySet().iterator();
    while (it.hasNext() && i < 2) {
        Map.Entry<String, Long> pair = it.next();
        if (i == 0) {
            mostFrequent = pair.getKey();
        } else {
            if (ordered.get(mostFrequent) == ordered.get(pair.getKey())) {
                return null;
            }
        }
        i++;
    }

    return mostFrequent;
}

但是流版本不处理具有相同频率的最常见元素。

private static String mostFrequentStream(List<String> elements) {
    return elements.stream()
            .reduce(BinaryOperator.maxBy(
                    Comparator.comparingInt(o -> Collections.frequency(elements, o))))
            .orElse(null);
}

如何修改上面的stream来实现?

最佳答案

使用分组:

String mostFrequentStream(List<String> elements) {
    Map<String, Long> temp = elements.stream()
            .collect(Collectors.groupingBy(a -> a, Collectors.counting()));


    return new HashSet<>(temp.values()).size() < temp.size() ? 
          null : temp.entrySet()
                     .stream()
                     .max(Map.Entry.comparingByValue())
                     .map(Map.Entry::getKey).get();

}

关于java - 最频繁的元素流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53596546/

相关文章:

java - 根据独立谓词将集合流式传输并收集到多个结果中

C 程序中的编译错误返回整数输入序列中出现次数最多的整数

audio - Arduino-如何在压电蜂鸣器上同时创建两个或更多音调?

java - 粘贴到文本区域

java - 指向同一 Integer 对象的变量之间的比较

Java SSL 重新协商(从 SSL 到清除 channel )

java - 膨胀类 fragment 时出错

自动关闭资源的Java 8 Stream(基于资源).iterator()?

java-8 - 使用 Java 8 将复杂对象列表转换为 Map

c# - 音频编程,产生和谐