【问题标题】:FizzBuzz solution in an arraylist数组列表中的 FizzBu​​zz 解决方案
【发布时间】:2019-08-02 18:36:02
【问题描述】:

我接受了经典的 FizzBu​​zz 测试。但是,该问题有一个额外的任务,即在 ArrayList 中显示结果。我知道您不能只将整数和字符串值放在一个列表中。因此,这给我带来了问题。

我尝试将从循环中得到的数字转换为字符串,但是它变得太复杂了,我想也许我过于复杂了。或者也许我做错了什么,因为这样一个简单的任务非常耗时。

下面我包含了我尝试过的最新代码和给我的指南 cmets。

  1. 实现将采用 List Range 并解析值以解决 FizzBu​​zz 的循环。
  2. 您需要在循环中成功地向私有类变量“私有列表范围”添加一个值。
  3. 例如,while 循环 3 将等于 fizz,应将其添加到 fizzBu​​zzList。
  4. 下面设置了两个私有变量,用于保存列表和 FizzBu​​zz 列表。

    public class FizzBuzz {
    
    private List range;
    private List fizzBuzzList = new ArrayList();
    
    
    public FizzBuzz(int startOfRange, int endOfRange){
        range = IntStream.rangeClosed(startOfRange, endOfRange).boxed().collect(Collectors.toList());
        fizzBuzzIterator(range);
    }
    
    public void fizzBuzzIterator(List range){
    
        for (int i = 1 ; i < range.size(); i++) {
    
            if (((i % 3) == 0) && ((i % 5) == 0)) {
                fizzBuzzList.add("FizzBuzz");
            }
    
            else if ((i % 3) == 0) {
    
                fizzBuzzList.add("Fizz");
            }
    
            else if ((i % 5) == 0) {
                fizzBuzzList.add("Buzz");
            }
    
            else {
                fizzBuzzList.add(i);
            }
    
        }
    }
    
    
    
    public List getFizzBuzzList() {
        return fizzBuzzList;
    }
    
    
     }
    

下面是我应该用来测试结果的测试代码。

public class FizzbuzzTests {

    FizzBuzz fizzBuzz = new FizzBuzz(1,16);

    @Test
    public void fizzBuzzIteratorTest(){
        List<String> minFizzBuzzList = List.of("1","2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz", "11", "Fizz", "13", "14", "FizzBuzz");
        Assert.assertEquals(fizzBuzz.getFizzBuzzList(), minFizzBuzzList);
    }

}

我看到的预期结果应该是这样的格式,例如 [1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBu​​zz] .上面写的代码给了我相同格式的结果,但是不同的是,一个使用“java.util.ArrayList”而另一个使用“java.util.ImmutableCollections$ListN”,因此这给了我一个错误。

我一直试图解决这个问题已经有一段时间了,而且我已经没有什么想法可以尝试了。任何建议都会很有帮助和赞赏。谢谢。

【问题讨论】:

  • Integer.toString(num);。或者,使用 Object 作为列表的泛型类型。不管怎样,避免使用原始类型
  • 您为什么不直接使用List&lt;String&gt; 并将数字存储为String。这不像您需要实际使用数字来进行计算。
  • 只是一个提示。能被 3 和 5 整除的东西也能被 15 整除。

标签: java arrays fizzbuzz


【解决方案1】:

此解决方案使用Integer.toString(int x) 函数将ints 转换为字符串。

List<String> list = IntStream.rangeClosed(startOfRange, endOfRange)
            .mapToObj(this::convert)
            .collect(Collectors.toList());
System.out.println(list);

private String convert(int number) {
    if (((number % 3) == 0) && ((number % 5) == 0)) {
        return "FizzBuzz";
    } else if ((number % 3) == 0) {
        return "Fizz";
    } else if ((number % 5) == 0) {
        return "Buzz";
    } else {
        return Integer.toString(number);
    }
}

【讨论】:

    【解决方案2】:

    我会将所有值存储到 List&lt;String&gt; 而不是泛型中,并利用 Integer.toString() 将迭代器转换为 String 来存储值。

    FizzBuzz 类在我的版本中如下所示:

    private List<String> fizzBuzzList;
    
    public FizzBuzz(int start, int end){
        fizzBuzzList = new ArrayList<>();
        this.populateFizzBuzz(start, end);
    }
    
    private void populateFizzBuzz(int start, int end){
        for (int i = start ; i < end; i++){
            if (((i % 3) == 0) && ((i % 5) == 0)) {
                fizzBuzzList.add("FizzBuzz");
            }
            else if ((i % 3) == 0) {
                fizzBuzzList.add("Fizz");
            }
            else if ((i % 5) == 0){
                fizzBuzzList.add("Buzz");
            }
            else{
                fizzBuzzList.add(Integer.toString(i));
            }
        }
    }
    
    public void printFizzBuzz(){
        for (String s : fizzBuzzList){
            System.out.println(s);
        }
    }
    

    我个人没有使用 Java 8 流作为偏好,我觉得它使一个简单的问题变得复杂,并使它变得更加复杂。

    您可以在 main 或任何静态方法中使用它:

    FizzBuzz fb = new FizzBuzz(1, 101);
    fb.printFizzBuzz();
    

    请注意,101 是独占,而 1 是包含,因此这将从 1 迭代到 100。

    【讨论】:

      【解决方案3】:

      这是一个流版本。它生成一个从 1 到 100 的封闭范围,然后使用嵌套的三元运算符将整数相应地映射到适当的值。

            List<String> list = IntStream.rangeClosed(1, 100).mapToObj(
                  n -> n % 15 == 0 ? "FizzBuzz"
                        : n % 3 == 0 ? "Fizz"
                              : n % 5 == 0 ? "Buzz"
                                    : Integer.toString(n)).collect(
                                          Collectors.toList());
            System.out.println(list);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-25
        • 1970-01-01
        • 1970-01-01
        • 2012-09-02
        • 1970-01-01
        • 2023-02-06
        相关资源
        最近更新 更多