Класс 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
Класс 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.
Nextint java что это
Наиболее простой способ взаимодействия с пользователем представляет консоль: мы можем выводить на консоль некоторую информацию или, наоборот, считывать с консоли некоторые данные. Для взаимодействия с консолью в Java применяется класс System , а его функциональность собственно обеспечивает консольный ввод и вывод.
Вывод на консоль
Для создания потока вывода в класс System определен объект out . В этом объекте определен метод println , который позволяет вывести на консоль некоторое значение с последующим переводом курсора консоли на следующую строку. Например:
public class Program < public static void main(String[] args) < System.out.println("Hello world!"); System.out.println("Bye world. "); >>
В метод println передается любое значение, как правило, строка, которое надо вывести на консоль. И в данном случае мы получим следующий вывод:
Hello world! Bye world.
При необходимости можно и не переводить курсор на следующую строку. В этом случае можно использовать метод System.out.print() , который аналогичен println за тем исключением, что не осуществляет перевода на следующую строку.
public class Program < public static void main(String[] args) < System.out.print("Hello world!"); System.out.print("Bye world. "); >>
Консольный вывод данной программы:
Hello world!Bye world.
Но с помощью метода System.out.print также можно осуществить перевод каретки на следующую строку. Для этого надо использовать escape-последовательность \n:
System.out.print("Hello world \n");
Нередко необходимо подставлять в строку какие-нибудь данные. Например, у нас есть два числа, и мы хотим вывести их значения на экран. В этом случае мы можем, например, написать так:
public class Program < public static void main(String[] args) < int x=5; int y=6; System.out.println("x=" + x + "; y console"> x=5; y=6
Но в Java есть также функция для форматированного вывода, унаследованная от языка С: System.out.printf() . С ее помощью мы можем переписать предыдущий пример следующим образом:
int x=5; int y=6; System.out.printf("x=%d; y=%d \n", x, y);
В данном случае символы %d обозначают спецификатор, вместо которого подставляет один из аргументов. Спецификаторов и соответствующих им аргументов может быть множество. В данном случае у нас только два аргумента, поэтому вместо первого %d подставляет значение переменной x, а вместо второго - значение переменной y. Сама буква d означает, что данный спецификатор будет использоваться для вывода целочисленных значений.
Кроме спецификатора %d мы можем использовать еще ряд спецификаторов для других типов данных:
- %x : для вывода шестнадцатеричных чисел
- %f : для вывода чисел с плавающей точкой
- %e : для вывода чисел в экспоненциальной форме, например, 1.3e+01
- %c : для вывода одиночного символа
- %s : для вывода строковых значений
public class Program < public static void main(String[] args) < String name = "Tom"; int age = 30; float height = 1.7f; System.out.printf("Name: %s Age: %d Height: %.2f \n", name, age, height); >>
При выводе чисел с плавающей точкой мы можем указать количество знаков после запятой, для этого используем спецификатор на %.2f , где .2 указывает, что после запятой будет два знака. В итоге мы получим следующий вывод:
Name: Tom Age: 30 Height: 1,70
Ввод с консоли
Для получения ввода с консоли в классе System определен объект in . Однако непосредственно через объект System.in не очень удобно работать, поэтому, как правило, используют класс Scanner , который, в свою очередь использует System.in . Например, напишем маленькую программу, которая осуществляет ввод чисел:
import java.util.Scanner; public class Program < public static void main(String[] args) < Scanner in = new Scanner(System.in); System.out.print("Input a number: "); int num = in.nextInt(); System.out.printf("Your number: %d \n", num); in.close(); >>
Так как класс Scanner находится в пакете java.util , то мы вначале его импортируем с помощью инструкции import java.util.Scanner .
Для создания самого объекта Scanner в его конструктор передается объект System.in . После этого мы можем получать вводимые значения. Например, в данном случае вначале выводим приглашение к вводу и затем получаем вводимое число в переменную num.
Чтобы получить введенное число, используется метод in.nextInt(); , который возвращает введенное с клавиатуры целочисленное значение.
Пример работы программы:
Input a number: 5 Your number: 5
Класс Scanner имеет еще ряд методов, которые позволяют получить введенные пользователем значения:
- next() : считывает введенную строку до первого пробела
- nextLine() : считывает всю введенную строку
- nextInt() : считывает введенное число int
- nextDouble() : считывает введенное число double
- nextBoolean() : считывает значение boolean
- nextByte() : считывает введенное число byte
- nextFloat() : считывает введенное число float
- nextShort() : считывает введенное число short
То есть для ввода значений каждого примитивного типа в классе Scanner определен свой метод.
Например, создадим программу для ввода информации о человеке:
import java.util.Scanner; public class Program < public static void main(String[] args) < Scanner in = new Scanner(System.in); System.out.print("Input name: "); String name = in.nextLine(); System.out.print("Input age: "); int age = in.nextInt(); System.out.print("Input height: "); float height = in.nextFloat(); System.out.printf("Name: %s Age: %d Height: %.2f \n", name, age, height); in.close(); >>
Здесь последовательно вводятся данные типов String, int, float и потом все введенные данные вместе выводятся на консоль. Пример работы программы:
Input name: Tom Input age: 34 Input height: 1,7 Name: Tom Age: 34 Height: 1,70
Обратите внимание, что для ввода значения типа float (то же самое относится к типу double) применяется число "1,7", где разделителем является запятая, а не "1.7", где разделителем является точка. В данном случае все зависит от текущей языковой локализации системы. В моем случае русскоязычная локализация, соответственно вводить необходимо числа, где разделителем является запятая. То же самое касается многих других локализаций, например, немецкой, французской и т.д., где применяется запятая.
Генерировать случайные целые числа между указанными диапазонами в Java
В этом посте будет обсуждаться, как генерировать случайные целые числа между указанным диапазоном в Java.
1. Использование Random Class
Мы можем использовать Random.nextInt() метод, который возвращает псевдослучайно сгенерированное значение int между 0 (включительно) и указанным значением (исключительно).
В следующем коде используется выражение nextInt(max - min + 1) + min для генерации случайного целого числа между min а также max . Он работает как nextInt(max - min + 1) генерирует случайное целое число от 0 до (max - min) , и добавление min к этому приведет к случайному целому числу между min к max .