Переменная внутри массива не обновляет свое значение в Java

#java #arrays #string #variables #fizzbuzz

#java #массивы #строка #переменные #fizzbuzz

Вопрос:

Я пытался решить проблему FizzBuzz и решил использовать массив для хранения первых 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: Является ли это хорошей реализацией в отношении наивного soln?

Комментарии:

1. Переназначение чего-либо на I не изменяет предыдущее использование I . Кроме того: понятия не имею, как этот код должен гудеть в первую очередь. Почему вы начинаете с того, что знаете , какое значение является fizz, buzz или fizzbuzz !? Это бессмысленно.

2. Переназначение переменной I не влияет на элементы в массиве. Это отдельные переменные.

3. Кстати, элемент 6, по-видимому, должен быть шипучим.

4. Нет, это ужасное решение, оно не работает, оно предполагает предварительное знание результата fizzbuzz, переменные названы неправильно, в нем есть недопустимые комментарии, … Это похоже на public int getRandomNumber() { return 3; /* randomly choosen */ }

5. @luk2302 справедливости ради, последовательность FizzBuzz является периодической с периодом 15, поэтому вы абсолютно точно знаете, какой результат будет следующим.

Ответ №1:

Причина, по которой переменная не обновляется, заключается в следующем: если вы создадите локальную переменную, например , here the 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 Naming Conventions).

Искренне ваш,
Vinzent

Ответ №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);
        }
    }
}