当前位置: 首页 > 知识库问答 >
问题:

FizzBuzz数字分组

关项明
2023-03-14

我正试图用Java8编写FizzBuzz问题的代码。它运行良好,我得到了期望的输出。对于可被“3”整除的数字,它应该返回“Fizz”;对于可被“5”整除的数字,它应该返回“Buzz”;对于可被两者整除的数字,它应该返回“FizzBuzz”。

如果我将值传递为“15”,它将返回:

["1","2","Fizz","4","Buzz","Fizz","7","8","Fizz","Buzz","11","Fizz","13","14","FizzBuzz"]

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

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

我想把数字按嘶嘶声、嗡嗡声和嘶嘶声进行分组。

这是我的代码:

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);
}
}

如果有人能给我指路我将感激不尽谢谢

共有3个答案

商夜洛
2023-03-14
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);
酆乐湛
2023-03-14

我会返回地图

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;
}

仉联
2023-03-14

以下是一种使用流的方法:

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"));

没有溪流:

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);
    }
}
 类似资料:
  • 我的程序中有很多textviews。我希望这些文本视图中的数字以3到3隔开。我应该为任何TextView编写代码吗?有没有一种方法可以编写一次代码并将其用于整个程序?谢谢你。

  • 使用DecimalFormat的setGroupingSize()方法,可以更改默认的数字分组。 以下示例说明了相同的内容。 IOTester.java import java.text.DecimalFormat; public class I18NTester { public static void main(String[] args) { double number =

  • 问题内容: 我正在尝试解决一个数学问题,我将一个数字(例如45或111),然后将其拆分为单独的数字(例如4 5或1 1 1)。然后,我将每个数字保存到var中以运行方法。有人知道如何将数字拆分为单个数字吗? 例如,我有一个在数组上运行的循环: 对于每个数字,我想拆分其数字并将其加在一起吗? 问题答案: 更新: 计算总和

  • 问题内容: 是否存在将数字分割成两个部分(即整数部分和小数部分)的有效方法? 问题答案: 用途:

  • 我遇到了以下问题, 您将获得一个包含 n 个元素的数组 A。这些元素现在被添加到一个新的列表L中,该列表最初是空的,根据给定的q查询以一定的顺序排列。 在每个查询中,都会为您提供一个与数组A中的A[i]对应的整数i。这意味着您必须将元素A[i】添加到列表L中。 将每个元素添加到列表L后,对列表L中的元素进行分组。如果数组A中的索引是连续的,则两个元素将属于同一组 对于每个组,我们将组的值定义为ax

  • 问题是: 你有N (N代表你拥有的数字的数量)个数字。将他们分成两组,使各组数字之和的差异最小。 例子: 如果我们把1、9和3放在A组,把5和8放在B组,差异是0。 我认为首先我应该计算所有数字的总和并将其除以2。然后检查任何可能的数字组合,其总和不大于所有数字之和的一半。完成此操作后,我将选择最大的数字并打印出组。 我对所有的组合都有问题,特别是当N是大数字时。如何运行所有组合? 我的想法也有点