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
相关产品推荐
相关产品推荐

