Как сделать диапазон чисел в java
Для создания диапазона чисел в Java можно использовать класс IntStream из пакета java.util.stream .
Метод range() класса IntStream создает последовательность чисел от начального значения (включительно) до конечного значения (исключая его).
Вот пример использования метода range() :
IntStream.range(1, 11).forEach(System.out::println);
В этом примере мы создаем диапазон чисел от 1 до 10, включительно. Метод forEach() используется для печати каждого числа в консоль.
Как можно указать в java диапазон натуральных чисел (0-6)?
Стоит задача написать программу, которая в зависимости от значения переменной, содержащей значение текущего часа выводит в терминал соответствующее этому часу сообщение. Задачу необходимо решить через Switch. В сутках 24 часа и писать 24 кейса будет не лучшим вариантом. Как можно в 1 case уместить значения от 0-6 , во 2й кейс 7 — 12 и тд. Пробовал через выражение inputNumber >=0 && inputNumber
Отслеживать
задан 17 сен 2022 в 23:27
Siarhei Rypinski Siarhei Rypinski
1 1 1 бронзовый знак
Интересно, если бы такая возможность была, то как тогда Вы видите написание разных сообщений для 2го и 5того часа, если они попадают в один кейс от 0 до 6?
17 сен 2022 в 23:44
Спасибо, что отозвались. Для диапазона 0-6 вывод в терминал одинаковый. Для 0,1,2,3,4,5,6 включительно. Если вводимое пользователем число попадает под этот кейс (условие) вывод будет 1 и тот же
17 сен 2022 в 23:48
Если использовать switch. case, то в java нет такой возможности, чтобы подставить диапазон. Поэтому придется 24 раза написать, разве что объединив несколько условий case 1: case 2: case 3: . System.out.println(«1-6»); break; case 7: case 8: case 9: . System.out.println(«7-12»); break;
18 сен 2022 в 0:01
@AlexanderPetrov у Java разработчиков специфическое представление о развитии, если язык чего-то не сделал, они делают свою реализацию xD. Нет свойств, держите lombok. Нужны сахара, вот вам kotlin, который встраивается прямо в Java и позволяет писать when (x) < in 1. 6 ->println(«1») in 7. 12 -> println(«2») > . Нужен функциональный стиль, держите scala.
18 сен 2022 в 0:17
А какие конкретно у вас диапазоны? Может, там по результату целочисленного деления на 6, например, можно делать проверку?
18 сен 2022 в 0:39
5 ответов 5
Сортировка: Сброс на вариант по умолчанию
switch (inputNumber)
Всё равно 24 кейса, но действие-то можно написать только один раз для группы последовательно идущих кейсов.
Отслеживать
ответ дан 17 сен 2022 в 23:58
6,308 1 1 золотой знак 12 12 серебряных знаков 18 18 бронзовых знаков
То то и оно, что получается 24 кейса в любом случае. Видимо это просто требование задачи. В реальных условиях через if — else и уравнение решить эту задачу проще и красивее. А то я уже и приведение boolean к int пробовал и что только ни делал, всё без толку. Спасибо за не равнодушие!
18 сен 2022 в 0:03
Если бы диапазоны часов были распределены равномерно по 6 часов:
[ 0, 6) -> [ 0.. 5], [ 6, 12) -> [ 6..11], [12, 18) -> [12..17], [18, 24) -> [18..23]
достаточно было бы обойтись четырьмя кейсами, разделив часы на ширину диапазона 6, как указано в комментариях и ответе Труфальдино (здесь и дальше используется синтаксис switch —выражения, доступного с Java 14):
public static String timeRange(int h) < return switch(h / 6) < case 0 ->"Доброй ночи! 0 - 6"; case 1 -> "Доброе утро! 6 - 12"; case 2 -> "Добрый день! 13 - 18"; case 3 -> "Добрый вечер! 18 - 24"; default -> "Здравствуйте"; >; >
Для неравномерного диапазона в «новом» синтаксисе switch можно перечислять значения через запятую (формально также будет 4 case):
public static String timeRange(int h) < return switch(h) < case 0, 1, 2, 3, 4, 5, 6 ->"Доброй ночи! 0- 6"; // 7 значений case 7, 8, 9, 10, 11, 12 -> "Доброе утро! 7 - 12"; // 6 значений case 13, 14, 15, 16, 17, 18 -> "Добрый день! 13 - 18"; // 6 значений case 19, 20, 21, 22, 23 -> "Добрый вечер! 19 - 23"; // 5 значений default -> "Здравствуйте"; >; >
Также для неравномерных диапазонов можно было бы создать enum с параметрами from, to и с методом для выбора соответствующего значения по входному значению hour:
enum TimeOfDay < NIGHT(0, 6), MORNING(7, 12), DAY(13, 18), EVENING(19, 23); private final int from; private final int to; TimeOfDay(int f, int t) < this.from = f; this.to = t; >public static TimeOfDay byHour(int hour) < return Stream.of(TimeOfDay.values()) .filter(td ->td.from new IllegalArgumentException( "Incorrect hour value, 0..23 expected, hour = " + hour )); > > public static String timeRange(int h) < return switch(TimeOfDay.byHour(h)) < case NIGHT ->"Доброй ночи! 0- 6"; case MORNING -> "Доброе утро! 7 - 12"; case DAY -> "Добрый день! 13 - 18"; case EVENING -> "Добрый вечер! 19 - 23"; >; >
Список чисел в диапазоне в Java
В этом уроке мы рассмотрим различные способы перечисления последовательностей чисел в пределах диапазона.
2. Список чисел в диапазоне
2.1. Традиционный цикл _
Мы можем использовать традиционный цикл for для генерации чисел в указанном диапазоне:
public ListInteger> getNumbersInRange(int start, int end) ListInteger> result = new ArrayList>(); for (int i = start; i end; i++) result.add(i); > return result; >
Приведенный выше код сгенерирует список, содержащий числа от начала (включительно) до конца (исключительно).
2.2. JDK 8 IntStream.диапазон
IntStream , представленный в JDK 8, может использоваться для генерации чисел в заданном диапазоне, устраняя необходимость в цикле for :
public ListInteger> getNumbersUsingIntStreamRange(int start, int end) return IntStream.range(start, end) .boxed() .collect(Collectors.toList()); >
2.3. IntStream.rangeClosed
В предыдущем разделе конец эксклюзивный. Чтобы получить числа в диапазоне, где конец включительно, есть IntStream.rangeClosed :
public ListInteger> getNumbersUsingIntStreamRangeClosed(int start, int end) return IntStream.rangeClosed(start, end) .boxed() .collect(Collectors.toList()); >
2.4. IntStream.iterate
В предыдущих разделах для получения последовательности чисел использовался диапазон. Когда мы знаем, сколько чисел необходимо в последовательности, мы можем использовать IntStream.iterate :
public ListInteger> getNumbersUsingIntStreamIterate(int start, int limit) return IntStream.iterate(start, i -> i + 1) .limit(limit) .boxed() .collect(Collectors.toList()); >
Здесь параметр limit ограничивает количество элементов для повторения.
3. Заключение
В этой статье мы увидели разные способы генерации чисел в пределах диапазона.
Фрагменты кода, как всегда, можно найти на GitHub .
Как в java указать диапазон чисел
Одной из основных особенностей Java является то, что данный язык является строго типизированным. А это значит, что каждая переменная и константа представляет определенный тип и данный тип строго определен. Тип данных определяет диапазон значений, которые может хранить переменная или константа.
Итак, рассмотрим систему встроенных базовых типов данных, которая используется для создания переменных в Java. А она представлена следующими типами.
-
boolean : хранит значение true или false
boolean isActive = false; boolean isAlive = true;
byte a = 3; byte b = 8;
short a = 3; short b = 8;
int a = 4; int b = 9;
long a = 5; long b = 10;
double x = 8.5; double y = 2.7;
float x = 8.5F; float y = 2.7F;
При этом переменная может принимать только те значения, которые соответствуют ее типу. Если переменная представляет целочисленный тип, то она не может хранить дробные числа.
Целые числа
Все целочисленные литералы, например, числа 10, 4, -5, воспринимаются как значения типа int , однако мы можем присваивать целочисленные литералы другим целочисленным типам: byte , long , short . В этом случае Java автоматически осуществляет соответствующие преобразования:
byte a = 1; short b = 2; long c = 2121;
Однако если мы захотим присвоить переменной типа long очень большое число, которое выходит за пределы допустимых значений для типа int, то мы столкнемся с ошибкой во время компиляции:
long num = 2147483649;
Здесь число 2147483649 является допустимым для типа long, но выходит за предельные значения для типа int. И так как все целочисленные значения по умолчанию расцениваются как значения типа int, то компилятор укажет нам на ошибку. Чтобы решить проблему, надо добавить к числу суффикс l или L , который указывает, что число представляет тип long:
long num = 2147483649L;
Как правило, значения для целочисленных переменных задаются в десятичной системе счисления, однако мы можем применять и другие системы счисления. Например:
int num111 = 0x6F; // 16-теричная система, число 111 int num8 = 010; // 8-ричная система, число 8 int num13 = 0b1101; // 2-ичная система, число 13
Для задания шестнадцатеричного значения после символов 0x указывается число в шестнадцатеричном формате. Таким же образом восьмеричное значение указывается после символа 0 , а двоичное значение — после символов 0b .
Также целые числа поддерживают разделение разрядов числа с помощью знака подчеркивания:
int x = 123_456; int y = 234_567__789; System.out.println(x); // 123456 System.out.println(y); // 234567789
Числа с плавающей точкой
При присвоении переменной типа float дробного литерала с плавающей точкой, например, 3.1, 4.5 и т.д., Java автоматически рассматривает этот литерал как значение типа double . И чтобы указать, что данное значение должно рассматриваться как float , нам надо использовать суффикс f:
float fl = 30.6f; double db = 30.6;
И хотя в данном случае обе переменных имеют практически одно значения, но эти значения будут по-разному рассматриваться и будут занимать разное место в памяти.
Символы и строки
В качестве значения переменная символьного типа получает одиночный символ, заключенный в одинарные кавычки: char ch=’e’; . Кроме того, переменной символьного типа также можно присвоить целочисленное значение от 0 до 65535 . В этом случае переменная опять же будет хранить символ, а целочисленное значение будет указывать на номер символа в таблице символов Unicode (UTF-16). Например:
char ch=102; // символ 'f' System.out.println(ch);
Еще одной формой задания символьных переменных является шестнадцатеричная форма: переменная получает значение в шестнадцатеричной форме, которое следует после символов «\u». Например, char ch=’\u0066′; опять же будет хранить символ ‘f’.
Символьные переменные не стоит путать со строковыми, ‘a’ не идентично «a». Строковые переменные представляют объект String , который в отличие от char или int не является примитивным типом в Java:
String hello = "Hello. "; System.out.println(hello);
Кроме собственно символов, которые представляют буквы, цифры, знаки препинания, прочие символы, есть специальные наборы символов, которые называют управляющими последовательностями. Например, самая популярная последовательность — «\n». Она выполняет перенос на следующую строку. Например:
String text = "Hello \nworld"; System.out.println(text);
Результат выполнения данного кода:
Hello world
В данном случае последовательность \n будет сигналом, что необходимо сделать перевод на следующую строку.
Начиная с версии 15 Java поддерживает тестовые блоки (text blocks) — многострочный текст, облеченный в тройные кавычки. Рассмотрим, в чем их практическая польза. Например, выведем большой многострочный текст:
String text = "Вот мысль, которой весь я предан,\n"+ "Итог всего, что ум скопил.\n"+ "Лишь тот, кем бой за жизнь изведан,\n"+ "Жизнь и свободу заслужил."; System.out.println(text);
С помощью операции + мы можем присоединить к одному тексту другой, причем продолжение текста может располагаться на следующей строке. Чтобы при выводе текста происходил перенос на следующую строку, применяется последовательность \n.
Результат выполнения данного кода:
Вот мысль, которой весь я предан, Итог всего, что ум скопил. Лишь тот, кем бой за жизнь изведан, Жизнь и свободу заслужил.
Текстовые блоки, которые появились в JDK15, позволяют упростить написание многострочного текста:
String text = """ Вот мысль, которой весь я предан, Итог всего, что ум скопил. Лишь тот, кем бой за жизнь изведан, Жизнь и свободу заслужил. """; System.out.println(text);
Весь текстовый блок оборачивается в тройные кавычки, при этом не надо использовать соединение строк или последовательность \n для их переноса. Результат выполнения программы будет тем же, что и в примере выше.