You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java Stream校验整数列表含两组重复≤2的不同数字及取最大重复值

Java Stream 相关问题解答

问题1:校验整数列表是否存在两组符合要求的重复数字

实现逻辑

  1. 先统计列表中每个整数的出现频率
  2. 检查是否存在任意整数的出现次数超过2,存在则直接返回false
  3. 统计出现次数恰好为2的整数数量,若数量≥2则返回true,否则返回false

代码实现

import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class NumberValidator {
    public static boolean hasTwoValidDuplicates(List<Integer> listOfNumbers) {
        // 统计每个数字的出现频率
        Map<Integer, Long> frequencyMap = listOfNumbers.stream()
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
        
        // 存在数字重复次数超过2直接不符合要求
        boolean hasOverLimit = frequencyMap.values().stream().anyMatch(count -> count > 2);
        if (hasOverLimit) {
            return false;
        }
        
        // 统计重复次数恰好为2的数字数量是否≥2
        return frequencyMap.values().stream().filter(count -> count == 2).count() >= 2;
    }
}

示例验证

  • 输入[2,3,2,4,3]:返回true,2和3各重复2次,符合要求
  • 输入[2,3,2,4,5]:返回false,仅2重复2次,不足两组
  • 输入[2,3,2,3,2]:返回false,2重复3次超出限制

问题2:调整代码返回符合要求的最大重复数字

原代码使用Collections.frequency每次判断都会全量遍历列表,数据量大时性能较差,优先采用先统计频率的方式实现:

基础版(匹配原代码逻辑,仅筛选重复次数为2的数字)

public static Optional<Integer> getMaxDuplicateNumber(List<Integer> listOfNumbers) {
    Map<Integer, Long> frequencyMap = listOfNumbers.stream()
            .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
    
    // 筛选重复次数为2的数字,取最大值
    return frequencyMap.entrySet().stream()
            .filter(entry -> entry.getValue() == 2)
            .map(Map.Entry::getKey)
            .max(Integer::compareTo);
}

返回值为Optional<Integer>,无符合条件的数字时会返回空对象,可通过getMaxDuplicateNumber(list).orElse(-1)自定义无结果时的默认返回值。

兼容问题1规则版(存在数字重复超过2时直接返回空)

public static Optional<Integer> getMaxValidDuplicateNumber(List<Integer> listOfNumbers) {
    Map<Integer, Long> frequencyMap = listOfNumbers.stream()
            .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
    
    // 存在数字重复次数超过2直接返回空
    boolean hasOverLimit = frequencyMap.values().stream().anyMatch(count -> count > 2);
    if (hasOverLimit) {
        return Optional.empty();
    }
    
    return frequencyMap.entrySet().stream()
            .filter(entry -> entry.getValue() == 2)
            .map(Map.Entry::getKey)
            .max(Integer::compareTo);
}

内容的提问来源于stack exchange,提问作者Slava

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 02:09:02