Перейти к содержимому

Nextint java что это

  • автор:

Ввод с клавиатуры

Для того чтобы пользователь мог что-то ввести с клавиатуры, существует стандартный поток ввода, представленный объектом System.in. Рассмотрим, как это происходит.

Для ввода данных с клавиатуры в Java используется метод System.in.read() — он возвращает код введенного символа. После его выполнения JVM останавливает программу и ждет, пока пользователь введет символ с клавиатуры. Для того чтобы вывести сам символ на консоль, выполняется его приведение к типу char :

public class SystemInDemo < public static void main(String[] args) throws IOException < int x = System.in.read(); char c = (char) x; System.out.println("Код символа: " + c + " language-java">import java.util.Scanner;

Методы этого класса позволяют считывать строку, значение типа int или double .

Методы класса Scanner :

  1. hasNextInt() - возвращает true если с потока ввода можно считать целое число.
  2. nextInt() - считывает целое число с потока ввода.
  3. hasNextDouble() - проверяет, можно ли считать с потока ввода вещественное число типа double .
  4. nextDouble() - считывает вещественное число с потока ввода.
  5. nextLine() - позволяет считывать целую последовательность символов, то есть строку.
  6. hasNext() - проверяет, а остались ли в потоке ввода какие-то символы.

В следующем примере метод hasNextInt() проверяет, ввел ли пользователь целое число. И с помощью метода nextInt() считываем введенное число. Если пользователь ввел строку, то программа выведет на консоль "Вы ввели не целое число":

import java.util.Scanner; public class ScannerDemo1 < public static void main(String[] args) < Scanner scanner = new Scanner(System.in); System.out.print("Введите целое число: "); if (scanner.hasNextInt()) < int i = scanner.nextInt(); System.out.println(i); >else < System.out.println("Вы ввели не целое число"); >> >

Рассмотрим пример, в котором используется метод nextDouble() для считывания дробного числа. Если же пользователь введет строку, то программа завершится с ошибкой времени выполнения. Чтобы этого не происходило, перед вызовом метода nextDouble() , сделайте проверку с помощью метода hasNextDouble() :

import java.util.Scanner; public class ScannerDemo2 < public static void main(String[] args) < Scanner scanner = new Scanner(System.in); // если ввести букву s, // то случится ошибка во время исполнения double i = scanner.nextDouble(); System.out.println(i); >>

Следующий пример использует метод nextLine() для считывания всей строки:

import java.util.Scanner; public class ScannerDemo3 < public static void main(String[] args) < Scanner scanner = new Scanner(System.in); String s1, s2; s1 = scanner.nextLine(); s2 = scanner.nextLine(); System.out.println(s1 + s2); >>

Презентацию с видео можно скачать на Patreon .

Странная работа 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 

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

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