【问题标题】:Variable inside array not updating its value in Java数组内的变量未在 Java 中更新其值
【发布时间】:2021-02-24 09:10:35
【问题描述】:

我正在尝试解决 FizzBu​​zz 问题,并决定使用数组将前 15 个结果存储在数组中,然后对其进行迭代。但是如果在循环中稍后更新,存储在数组中的变量不会更新其值

import java.util.Scanner;

 public class FizzBuzz {

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner sc= new Scanner(System.in);
    System.out.println("Enter the number"); 
    int Num= sc.nextInt();
    String F= "Fizz";
    String B= "Buzz";
    String FB= "FizzBuzz";
    String I="";
    String arr[]= {FB, I, I, F, I, B, I, I, I, F, B, I, F, I, I};
    for (int j = 1; j <= Num; j++) {
        I = Integer.toString(j);
        System.out.println(arr[j%15]);
    }
  }
}

变量 I 不会在 for 循环中改变它的值。它只是在 I 变量的结果中打印空格。救命!

P.S:对于 naive soln,这是一个很好的实现吗?

【问题讨论】:

  • 将某些内容重新分配给I 不会改变I 的先前用途。除此之外:不知道该代码首先应该如何发出嘶嘶声。为什么你一开始就知道哪个值是 fizz、buzz 或 fizzbuzz!?这是废话。
  • 重新分配变量I 不会影响数组中的元素。它们是单独的变量。
  • 顺便说一句,元素 6 应该是嘶嘶声。
  • 不,这是一个糟糕的解决方案,它不起作用,它假设先验知识 fizzbuzz 结果,变量命名错误,其中包含无效的 cmets,...类似于public int getRandomNumber() { return 3; /* randomly choosen */ }
  • @luk2302 公平地说,FizzBu​​zz 序列是周期性的,周期为 15,所以你绝对知道接下来会发生什么输出。

标签: java arrays string variables fizzbuzz


【解决方案1】:

变量不更新的原因如下: 如果你创建一个局部变量,比如这里的String I = ...,并将它传递给一个数组,它将作为变量的实例存储在那里。如果更改字符串(或字符串的值),则实例会更改。所以一个字符串被认为是一个实例。如果您创建一个新字符串,您将自动创建一个新实例 - (String s =) new String(...) 相当于更改变量 s = "..."。您可以为字符串编写一个包装器,其中字符串值是“可变的”,即可以更改,而无需更改数组中传递的实际实例。
您还可以更改代码,而无需包装器:

    public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("Enter the number");
    int num = sc.nextInt();
    String f = "Fizz";
    String b = "Buzz";
    String fb = "FizzBuzz";
    String i = "";
    String[] arr = {fb, i, i, f, i, b, i, i, i, f, b, i, f, i, i};
    for (int j = 1; j <= num; j++) {
        int index = j % 15;

        //local constant to check for equality to the i-variable
        final String pos = arr[index];

        String strToInt = Integer.toString(j);
        
        //Check for equality to the "i"-variable
        if (pos.equals(i)) {
            arr[index] = strToInt;
        }

        //Changing the i-instance to the strToInt instance
        i = strToInt;
        
        //Printing your result
        System.out.println(arr[index]);
    }
}

我还将变量名称更改为有效名称,如 JNC(Java 命名约定)所述。

您真诚的,
文森特

【讨论】:

    【解决方案2】:
    import java.util.Scanner;
    
    public class Main {
    
        public static void main(String[] args) {
    
            Scanner sc = new Scanner(System.in);
            System.out.println("Enter the number");
            int num = sc.nextInt();
            String f = "Fizz";
            String b = "Buzz";
            String fb = "FizzBuzz";
            String i = "";
            String[] arr = {fb, i, i, f, i, b, i, i, i, f, b, i, f, i, i};
    
            String indexValue;
            for (int j = 1; j <= num; j++) {
                indexValue = arr[j % 15];
                System.out.println(indexValue.equals(i) ? j : indexValue);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-11-01
      • 1970-01-01
      • 2023-03-13
      • 2016-07-03
      • 1970-01-01
      • 2013-04-14
      • 1970-01-01
      • 2021-03-16
      • 2021-10-27
      相关资源
      最近更新 更多