Java — размер массива не обновляется

#java #arrays #user-input

#java #массивы #пользовательский ввод

Вопрос:

Считайте целые числа от пользователя, затем отобразите список введенных чисел и частоту каждого значения. Количество входных данных должно варьироваться от 1-30, а значения принимают 0-9.

Моя проблема в том, что массив всегда по умолчанию равен 1, даже если я изменяю его на int[] numbers = new int[numInputs]; . Похоже, что во время первого numInputs цикла for записывается значение 1, но даже при изменении значения numInputs оно по-прежнему равно 1. Я уверен, что моя логика неверна, но я не уверен, где.

 
public class Occurrence
{
    public static void main(String[] args)
    {
        //variables
        Scanner keyboard = new Scanner(System.in);
        int numInputs = 1, temp;
        int[] numbers = new int[31];
        int[] count = new int[31];
        boolean success = false;

        //start of program
        System.out.println("How many input values [max:30]?");

        //while no valid input
        while (!success)
        {
            try
            {
                numInputs = keyboard.nextInt(); //get a number
                numInputChecker(numInputs);     //is it valid?
                success = true;                 //ok

            }
            catch (Exception e)                 //else get a new number
            {
                keyboard.nextLine();
                System.out.println("Whole numbers 1 through 30 only, please.");

            }
        }
        //reset the loop checker
        success = false;

        //read numbers to fill that array
        System.out.println("Enter "   numInputs   " numbers.");

        for(int i = 0; i < numInputs; i  )     //from 0 to max number
        {
            while (!success)                   //while no valid number
            {
                try
                {
                    numbers[i] = keyboard.nextInt();    //fill the current cell with a number
                    numberChecker(numbers[i]);          //is it valid?
                    success = true;                     //ok
                }
                catch (Exception e)                     //else get a new number
                {
                    keyboard.nextLine();
                    System.out.println("Whole numbers 0 through 9 only, please.");
                }
            }
        }

       //take the input and count each use of element
        for (int i = 0; i< numbers.length; i  )     //for 0 to max number
        {
            temp = numbers[i];  //get the current value of the cell
            count[temp]  ;      //add the use of that value to a new array's cell
        }

        for(int i = 0; i < count.length; i  )   //from 0 to 9 (expected)
        {

            if (count[i] > 0 amp;amp; count[i] == 1)  //if cell not empty
            {
                System.out.println(i   " "   count[i]);  //print the current cell and how many times it was used
            }
        }

    }

    static void numInputChecker(int integer) throws Exception
    {
        if ((integer < 1) || (integer > 30))    //if 0 or negative, or if 31 
        {
            throw new Exception();              //say no
        }
    }

    static void numberChecker(int integer) throws Exception
    {
        if ((integer < 0) || (integer > 9)) //if negative or 10 
        {
            throw new Exception();          //say no
        }
    }

}
  

Ответ №1:

Логика нарушается во втором цикле, когда вы проверяете массив, потому что переменная успеха не сбрасывается для последующих циклов while. Это довольно легко исправить как таковое:

         for (int i = 0; i < numInputs; i  )     //from 0 to max number
    {
        while (!success)                   //while no valid number
        {
            try {
                numbers[i] = keyboard.nextInt();    //fill the current cell with a number
                numberChecker(numbers[i]);          //is it valid?
                success = true;                     //ok
            } catch (Exception e)                     //else get a new number
            {
                keyboard.nextLine();
                System.out.println("Whole numbers 0 through 9 only, please.");
            }
        }
        success = false; // [amsilf]: That's the cycle reset
    }
  

Ответ №2:

Вероятно, java.util.NoSuchElementException возникает и улавливает ошибку, обрабатывающую блок.

Используйте keyboard.hasNextInt() раньше keyboard.nextInt() .

Вот так!

 try {
   keyboard.hasNext(); // here!
   numInputs = keyboard.nextInt(); //get a number
   numInputChecker(numInputs);     //is it valid?
   success = true;                 //ok
}
...
  

Ответ №3:

В последнем цикле for должно быть так

     for(int i = 0; i < count.length; i  )   //from 0 to 31(expected)
    {

        if (count[i] > 0)  //if cell not empty
        {
            System.out.println(i   " "   count[i]);  //print the current cell and how many times it was used
        }
    }