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

Java8 FizzBuzz分组输出功能实现求助

嘿,很高兴看到你已经把基础FizzBuzz的规则体系搭得这么清晰了!要实现分组输出的需求其实很顺畅,咱们可以基于现有的代码逻辑扩展,不用大动干戈。

首先得提个关键细节:你当前用的HashSet<Rule>没法保证规则的遍历顺序,这会导致优先级问题——比如数字15可能先匹配到%3==0的规则,被错误归类到Fizz而不是FizzBuzz。所以第一步先把规则集合改成LinkedHashSet,这样能严格按照你添加规则的顺序来匹配:

private Set<Rule> rules = new LinkedHashSet<>(); // 替换原有的HashSet

接下来,咱们新增一个方法来生成分组结果。核心思路是遍历1到n的每个数字,用你已经写好的getValue方法判断它属于哪个分组,然后把数字对应加到分组列表里:

public Map<String, List<Integer>> getFizzBuzzGroups(int n) {
    // 初始化三个分组的空列表,提前定义key避免后续重复判断
    Map<String, List<Integer>> resultGroups = new HashMap<>();
    resultGroups.put("Fizz", new ArrayList<>());
    resultGroups.put("Buzz", new ArrayList<>());
    resultGroups.put("FizzBuzz", new ArrayList<>());

    for (int i = 1; i <= n; i++) {
        String currentResult = getValue(i);
        // 如果当前结果是我们定义的分组key,就把数字i加入对应列表
        if (resultGroups.containsKey(currentResult)) {
            resultGroups.get(currentResult).add(i);
        }
    }

    return resultGroups;
}

这样写的好处是完全复用了你现有的规则判断逻辑,不用重复写%3==0这类条件,保持代码的一致性。而且如果以后你要添加新规则(比如被7整除返回"Bang"),只需要在构造函数里加addRule(i -> i%7==0, "Bang"),然后在resultGroups里多初始化一个"Bang"的空列表就行,扩展性很强。

测试输入15的情况,这个方法会返回你想要的结果:

{"Fizz": [3, 6, 9, 12], "Buzz": [5, 10], "FizzBuzz": [15]}

如果你喜欢更简洁的写法,也可以用Java 8的Stream API实现,代码会更紧凑:

public Map<String, List<Integer>> getFizzBuzzGroupsWithStream(int n) {
    return IntStream.rangeClosed(1, n)
            .boxed()
            .collect(Collectors.groupingBy(this::getValue,
                    Collectors.filtering(key -> Arrays.asList("Fizz", "Buzz", "FizzBuzz").contains(key),
                            Collectors.toList())));
}

不过第一种写法更直观,适合后续维护和理解。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:47:15