#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
}
}