Nextint java что это
Перейти к содержимому

Nextint java что это

  • автор:

Странная работа scanner.nextInt()

Всем привет. Я совсем новичок и все утро ломаю голову над таким вопросом. К примру, простая программа, которая записывает вопросы и ответы в массив:

import java.util.Scanner; class proba < public static void main(String[] args) < Scanner scan = new Scanner(System.in); System.out.println("Input the number of cards:"); int skolko = scan.nextInt(); String[] vopros = new String[skolko]; String[] otvet = new String[skolko]; int i = 0; for (; i < skolko; i++) < System.out.println("The card #" + (i + 1) + ":"); vopros[i] = scan.nextLine(); System.out.println("The definition of the card #" + (i + 1) + ":"); otvet[i] = scan.nextLine(); >> > 

Если переменную int skolko записывать в программу ( int skolko = 3; ) то программа работает адекватно и запрашивает по очереди вопрос / ответ ровно 3 раза.

The card #1:  

Если переменную skolko вводить через int skolko = scan.nextInt(); , то программа сперва просит ввести цифру, а потом сразу выводит

The card #1: The definition of the card #1:  

то есть ввода значения, после The card #1: не происходит и для card #1 присваивается пустое значение ( "" ). Почему так?

Отслеживать
7,759 1 1 золотой знак 24 24 серебряных знака 47 47 бронзовых знаков
задан 10 апр 2020 в 11:52
51 1 1 серебряный знак 4 4 бронзовых знака

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Причина проблемы:

Сначала нужно понять как работает scanner.nextLine() . Он дочитывает строку (по факту, он движется по массиву байт из InputStream консоли, т.е. из System.in ) до её конца (до \n , либо \r\n , в зависимости от среды), после чего останавливается на первом же символе после символа(ов) конца строки, а все что он прочитал (за исключением символа(ов) конца строки он возвращает в качестве результата вызова).

Перед for вы вызываете scanner.nextInt() , который считывает число из InputStream консоли и останавливает свой указатель на первым же символе после окончания числа, в вашем случае, т.к. после ввода числа вы нажали enter у вас там находится символ(ы) перевода строки.

На первой итерации for у вас вызывается scanner.nextLine() , который согласно вышеописанному механизму читает все символы до конца строки и останавливается, но в вашем случае он уже стоял на символе конца строки, поэтому он просто сдвинул свой указатель на первый же символ после символа(ов) конца строки и остановился, а в результате своего вызова вернул пустую строку ( "" ).

Решение проблемы:

Самый простой для вас способ: написать scanner.nextLine(); сразу же после вызова scanner.nextInt(); для перевода scanner на следующую строку (указатель в считываемом InputStream смещается на первый символ после символа(ов) конца текущей строки), где ввод символа контра строки еще не был осуществлен (т.к. её ввод, вообще, еще не был осуществлен).

Пример альтернативного варианта использования nextInt:

На основании вопросов из комментариев приведу пример, поясняющий как еще можно работать с методом nextInt :

public class Example < public static void main(String[] args) < Scanner scanner = new Scanner(System.in); System.out.println("Введите три числа в одну строку, разделенные пробельными символами:"); System.out.println(scanner.nextInt()); System.out.println(scanner.nextInt()); System.out.println(scanner.nextInt()); >> 

Как видите, не обязательно выполнять nextLine после каждого nextInt , вы можете за раз из одной строки прочитать несколько чисел, разделенных пробельными символами.

Рекомендации:

В рамках Java для наименования классов согласно naming conventions принято использовать стиль UpperCamelCase (например, Proba ), а не lowerCamelCase, как у вас ( proba ).

Класс Random

Класс java.util.Random представляет собой генератор псевдослучайных чисел.

Класс представлен двумя конструкторами

  • Random() - создаёт генератор чисел, использующий уникальное начальное число
  • Random(long seed) - позволяет указать начальное число вручную

Так как класс создаёт псевдослучайное число, то задав начальное число, вы определяете начальную точку случайной последовательности. И будете получать одинаковые случайные последовательности. Чтобы избежать такого совпадения, обычно используют второй конструктор с использованием текущего времени в качестве инициирующего значения.

  • boolean nextBoolean() - возвращает следующее случайное значение типа boolean
  • void nextBytes(byte[] buf) - заполняет массив случайно созданными значениями
  • double nextDouble() - возвращает следующее случайное значение типа double
  • float nextFloat() - возвращает следующее случайное значение типа float
  • synchronized double nextGaussian() - возвращает следующее случайное значение гауссова случайного числа, т.е. значения, центрированное по 0.0 со стандартным отклонением в 1.0 (кривая нормального распределения)
  • int nextInt(int n) - возвращает следующее случайное значение типа int в диапазоне от 0 до n
  • int nextInt() - возвращает следующее случайное значение типа int
  • long nextLong() - возвращает следующее случайное значение типа long
  • synchronized void setSeeD(long seed) - устанавливает начальное значение

Пример для вывода случайного числа.

 final Random random = new Random(); public void onClick(View v)

Случайные числа часто используются в играх. Допустим, мы хотим вывести случайные числа от 1 до 6 при бросании игрального кубика. Попробуем.

 mInfoTextView.setText(String.valueOf(random.nextInt(6))); 

При проверке вы заметите две нестыковки. Во-первых, иногда выпадает число 0, которого нет на кубике, а во-вторых никогда не выпадает число 6. Когда вы помещаете число в параметр метода, то это означает, что выпадают числа в диапазоне от 0 до указанного числа, которое в этот диапазон не входит. Если вы будете использовать число 7, то шестёрка станет выпадать, но по-прежнему будет выпадать число 0. Поэтому пример следует немного отредактировать.

 mInfoTextView.setText(String.valueOf(random.nextInt(6) + 1)); 

Для генерации 10 чисел типа int используйте код:

 String result = ""; for(int i = 0; i < 10; i++)< result += String.valueOf(myRandom.nextInt()) + "\n"; >mInfoTextView.setText(result); 

Генерация в определённом интервале

Нужны случайные числа от 100 до 200? Пишем код.

 int min = 100; int max = 200; int diff = max - min; Random random = new Random(); int i = random.nextInt(diff + 1); i += min; 

Случайные цвета

Работать с числами не слишком интересно. Давайте поработаем со цветом. В Android некоторые цвета имеют конкретные названия, но по сути они являются числами типа int, например, красный цвет имеет константу Color.RED. Вам не надо знать, какое число соответствует этому цвету, так как проще понять по его названию.

 public void onClick(View view) < Random random = new Random(); // Массив из пяти цветов int colors[] = < Color.BLUE, Color.GREEN, Color.MAGENTA, Color.RED, Color.CYAN >; int pos = random.nextInt(colors.length); // Меняем цвет у кнопки mButton.setBackgroundColor(colors[pos]); > 

Щёлкая по кнопке, вы будете менять её цвет случайным образом.

Лотерея "6 из 49"

Сформируем шесть случайных чисел из 49 и занесём их в списочный массив.

 public void onClick(View v) < ArrayListlotteryList = getRandomNumber(); Log.i("Lottery", "" + lotteryList.get(0) + "," + lotteryList.get(1) + "," + lotteryList.get(2) + "," + lotteryList.get(3) + "," + lotteryList.get(4) + "," + lotteryList.get(5)); > private ArrayList getRandomNumber() < ArrayListnumbersGenerated = new ArrayList<>(); for (int i = 0; i < 6; i++) < Random randNumber = new Random(); int iNumber = randNumber.nextInt(48) + 1; if (!numbersGenerated.contains(iNumber)) < numbersGenerated.add(iNumber); >else < i--; >> return numbersGenerated; > 

SecureRandom

Стандартный класс Random обычно используют для простых задач, не связанных с шифрованием. Для криптографии следует использовать схожий класс java.security.SecureRandom.

 SecureRandom secureRandom = new SecureRandom(); mInfoTextView.setText(String.valueOf(secureRandom.nextInt(6))); 

Не забывайте, что в классе Math есть метод random(), возвращающий случайное число от 0 до 1 (единица в диапазон не входит).

В Java 7 появился новый класс java.util.concurrent.ThreadLocalRandom. В Java 8 появился ещё один класс SplittableRandom.

Класс Scanner

Класс Scanner упрощает разбор строки из потока ввода, позволяя обойтись без классов BufferedReader, InputStreamReader. В качестве входных объектов можно использовать File, InputStream, String, Readable. В учебных примерах часто используют System.in в качестве приёма данных от настольной клавиатуры, что не слишком актуально для Android.

Метод next() возвращает следующую лексему String, также существуют методы для примитивных типов, например, nextInt(). Метод выполняется в блокирующем режиме. Также существуют соответствующие методы hasNext(), которые возвращают true, если следующая лексема относится к правильному типу.

По умолчанию входные данные разбиваются по пробелам между словами. Можно задать собственный разделитель в форме регулярного выражения в методе useDelimiter().

Простейший пример разбивки предложения на отдельные слова.

 Scanner scanner = new Scanner("Кот Васька 28 Москва"); while (scanner.hasNext()) < System.out.println(scanner.next()); >// Ответ I/System.out: Кот I/System.out: Васька I/System.out: 28 I/System.out: Москва 
 Scanner scanner = new Scanner("27"); System.out.println(scanner.nextInt()); // 27 

hasNextInt() и nextInt()

Доброго времени суток. Предполагалось, что программа будет проверять наличие следующего вводимого числа, и, если оно существует, то присваивать его переменной х. На деле же переменной присваивается не первое проверенное число, а следующее. Пример входных данных: 14 11 19 9 ENTER. Программа проверяет, что следующее вводимое число 14 существует, и затем присваивает переменной х не 14, а 11. Я знаю, что можно переписать программу по другому, но в данном случае мне просто интересно, почему вообще это так работает? И есть ли у сканнера метод, позволяющий не перескакивать на следующее число (11), а присвоить проверяемое (14)? Заранее благодарю за ответ

Дерево классов

Напишем программу, в которой нужно вводить с клавиатуры целые числа и считать их сумму, пока пользователь не введет слово "ENTER" .
Вывести на экран полученную сумму и завершить программу.

Требования:
Программа должна считывать данные c клавиатуры.

Необходимо посчитать сумму введенных целых чисел и вывести её на экран, если пользователь ввел стоп слово.

В программе необходимо использовать цикл while.
Solution.java

  • Solution.java

Комментарии (7)

  • популярные
  • новые
  • старые

Для того, чтобы оставить комментарий Вы должны авторизоваться
18 октября 2023, 10:26

Я немного считерил но код получился минимальным. Читерство в том что я не проверял на "ENTER" а прерывал суммирование если следующее НЕ число:

public class Solution  public static void main(String[] args)  Scanner console = new Scanner(System.in); int i = 0; while (console.hasNextInt())  i = i + Integer.parseInt(console.nextLine()); > System.out.println(i); > >

Это решение было принято. И я теперь не могу проверить другие варианты, но покумекал еще минут 20 и кому надо прямо с проверкой на ENTER, то по идее это решение должно работать:

public class Solution  public static void main(String[] args)  Scanner console = new Scanner(System.in); int i = 0; boolean end = false; while (!end)  if (console.hasNextInt()) i = i + Integer.parseInt(console.nextLine()); else if (console.nextLine()).equals("ENTER")) end = true; > System.out.println(i); > >

26 января 2023, 18:38

public class Solution  public static void main(String[] args)  //напишите тут ваш код Scanner console = new Scanner(System.in); int x0 = 0; int x; boolean isEnter = false; while (!isEnter)  isEnter = console.hasNextLine() ? (console.nextLine()).equals("ENTER") : false; x = console.hasNextInt() ? console.nextInt() : 0; System.out.println(x); x0 = x0 + x; > System.out.println(x0); > >

Я потратил на это 4 часа грёбаных часа, но сделал это!
Ksenia Volkova Java Developer в DXC Master
8 сентября 2021, 13:06
Число - это тоже строка, только состоящаяиз цифр. Поэтому hasNextLine для числа тоже вернет true.
Уровень 37
8 сентября 2021, 13:09

Если я поставлю там hasNextLine вместо hasNextInt, то когда у меня будет ENTER, scanner выдаст ошибку при попытке присвоить nextInt переменной x По крайней мере поначалу у меня было так. А почему, все-таки, вообще не работает hasNextInt здесь? UPD: да, scanner выдает ошибку

Ksenia Volkova Java Developer в DXC Master
8 сентября 2021, 13:19 решение
Он работает. Просто первое число попадает в переменную isEnter. А второе - в x. И так далее.
Уровень 37
8 сентября 2021, 13:20

Ааа, вот оно что. Получается, первое сжирается проверкой на ENTER. Спасибо, сейчас попробую исправить!

Уровень 37
8 сентября 2021, 13:20
Супер, помогло, спасибо огромное ❤️

  • Курсы программирования
  • Регистрация
  • Курс Java
  • Помощь по задачам
  • Цены
  • Задачи-игры

Сообщество

JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *