首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FizzBuzz数分组

FizzBuzz数分组
EN

Stack Overflow用户
提问于 2018-01-20 09:25:52
回答 4查看 1.2K关注 0票数 4

我正在尝试在FizzBuzz中编写Java8问题。它工作得很好,我得到了想要的输出。对于可被"3“整除的数字,它应该返回"Fizz",对于可被"5”整除的数字,它应该返回"Buzz“,对于可被两者整除的数字,它应该返回"FizzBuzz”。

如果以"15“的形式传递值,它将返回:

代码语言:javascript
运行
复制
["1","2","Fizz","4","Buzz","Fizz","7","8","Fizz","Buzz","11","Fizz","13","14","FizzBuzz"]

现在,我被困在一件事上。如果将值传递为“15”,则希望得到如下输出:

代码语言:javascript
运行
复制
{"Fizz": [3, 6, 9, 12],"Buzz": [5, 10],"FizzBuzz": [15]}

我想按Fizz、Buzz和FizzBuzz对数字进行分组。

这是我的代码:

代码语言:javascript
运行
复制
public class FizzBuzzService {

private Map<Rule, String> ruleContainers = new HashMap();
private Set<Rule> rules  = new HashSet();

public FizzBuzzService(){
    addRule(i -> i % 15 == 0, "FizzBuzz");
    addRule(i -> i % 3 == 0, "Fizz");
    addRule(i -> i % 5 == 0, "Buzz");
}

public void addRule(Rule rule, String res) {
    rules.add(rule);
    ruleContainers.put(rule, res);
}

public String getValue(int i) {
    for (Rule rule : rules) {
        if (rule.apply(i)) {
            return ruleContainers.get(rule);
        }
    }
    return String.valueOf(i);
}

//then the origin code should be as follows:
public List<String> fizzBuzz(int n) {
     List<String> res = new ArrayList();
     for(int i = 1; i <= n; i++){
         res.add(getValue(i));
     }
     return res;
 }

interface Rule{
    boolean apply(int i);
}
}

如果有人能指点我,我会非常感激的。谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-01-20 09:34:04

我将返回一个Map<String, List<Integer>> (使用LinkedHashMap而不是HashMap,您的键将保留插入顺序),为fizzbuzzfizzbuzz值创建List<Integer>。它可以在一个static方法中完成,比如,

代码语言:javascript
运行
复制
public static Map<String, List<Integer>> fizzBuzz(int n) {
    Map<String, List<Integer>> map = new HashMap<>();
    List<Integer> fizz = new ArrayList<>(), //
            buzz = new ArrayList<>(), //
            fizzbuzz = new ArrayList<>();
    IntStream.rangeClosed(1, n).forEachOrdered(i -> {
        boolean f = i % 3 == 0, b = i % 5 == 0;
        if (f && b) {
            fizzbuzz.add(i);
        } else if (f) {
            fizz.add(i);
        } else if (b) {
            buzz.add(i);
        }
    });
    map.put("Fizz", fizz);
    map.put("Buzz", buzz);
    map.put("FizzBuzz", fizzbuzz);
    return map;
}
票数 2
EN

Stack Overflow用户

发布于 2018-01-20 19:26:32

这里有一种处理流的方法:

代码语言:javascript
运行
复制
Map<String, List<String>> result = IntStream.rangeClosed(1, n)
    .filter(i -> i % 3 == 0 || i % 5 == 0)
    .boxed()
    .collect(Collectors.groupingBy(i ->
        i % 15 == 0 ? "FizzBuzz" :
        i %  3 == 0 ? "Fizz" : 
                      "Buzz"));

无溪流:

代码语言:javascript
运行
复制
Map<String, List<String>> result = new HashMap<>();
for (int i = 0; i < n; i++) {
    if (i % 3 == 0 || i % 5 == 0) {
        String key = i % 15 == 0 ? "FizzBuzz" :
                     i %  3 == 0 ? "Fizz" : 
                                   "Buzz";
        result.computeIfAbsent(key, k -> new ArrayList<>()).add(i);
    }
}
票数 3
EN

Stack Overflow用户

发布于 2018-01-20 10:07:39

代码语言:javascript
运行
复制
Map<String, List<Integer>> map = 
  IntStream.rangeClosed(1, 15)
    .mapToObj(n -> {
        String str = n % 15 == 0 ? "FizzBuzz" : 
            (n % 5 == 0) ? "Buzz" : (n % 3 == 0) ? "Fizz" : null;
        return str == null ? null : new SimpleEntry<>(str, n);
    }).filter(Objects::nonNull)
    .collect(groupingBy(Entry::getKey, mapping(Entry::getValue, toList())));

System.out.println(map);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48354492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档