为了账号安全,请及时绑定邮箱和手机立即绑定

arraylist 中的 FizzBu​​zz 解决方案

arraylist 中的 FizzBu​​zz 解决方案

料青山看我应如是 2023-05-10 17:07:02
我被要求进行经典的 FizzBuzz 测试。但是,该问题还有一项额外任务,即在 ArrayList 中显示结果。我知道您不能将一个整数和一个字符串值放在一个列表中。因此,这给我带来了问题。我已经尝试将从循环中获得的数字转换为字符串,但是它变得太复杂了,我想也许我把事情复杂化了。或者,也许我做错了什么,因为如此简单的任务如此耗时。下面我包含了我尝试过的最新代码和我得到的指导意见。实现将获取列表范围并解析值以解决 FizzBuzz 问题的循环。您需要在循环内将成功值添加到私有类变量“私有列表范围”。例如,while 循环 3 将等于应该添加到 fizzBuzzList 中的 fizz。下面设置了两个私有变量,用于保存列表和 FizzBuzz 列表。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, FizzBuzz] 等格式。上面写的代码以相同的格式给出了结果,但是,区别在于一个使用“java.util.ArrayList”而另一个使用“java.util.ImmutableCollections$ListN”,因此这给了我一个错误。一段时间以来,我一直在尝试解决这个问题,但我已经没有什么想法可以尝试了。任何建议都会很有帮助和赞赏。谢谢。
查看完整描述

3 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

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


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

    }

}


查看完整回答
反对 回复 2023-05-10
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

这是一个流版本。它生成一个从 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);


查看完整回答
反对 回复 2023-05-10
?
千巷猫影

TA贡献1829条经验 获得超7个赞

我会将所有值存储到 aList<String>而不是泛型中,并利用Integer.toString()将迭代器转换为 aString来存储值。


在我的版本中,这个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。


查看完整回答
反对 回复 2023-05-10
  • 3 回答
  • 0 关注
  • 170 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信