Как проверить ввод числа на пустую строку?
Идея ругается что примитивы не могут быть приравняны к String или null. Заменил int на Integer и пробовал через == null или .equals(» «) то же самое, подсказывает что результат всегда false. Попробовал завернуть считывание строки в try catch и при исключении делать break, тогда переменная i становится недостижима для метода map.put() Подскажите в какую сторону думать то
Дерево классов
Программа вводит с клавиатуры пару (число и строку) и выводит их на экран.
Нужно сделать так, чтобы программа вводила с клавиатуры пары (число и строку) и сохраняла их в HashMap .
Ключевые требования:
- Пустая строка — конец ввода данных.
- Числа могут повторяться.
- Строки всегда уникальны.
- Введенные данные не должны потеряться!
Затем программа должна выводить содержание HashMap на экран.
Каждую пару — с новой строки.
Пример ввода:
1
Мама
2
Рама
1
Мыла
Пример вывода:
1 Мыла
2 Рама
1 Мама
Требования:
Программа должна считывать данные с клавиатуры.
Программа должна выводить текст на экран.
В методе main объяви переменную коллекции HashMap и сразу проинициализируй ee.
Программа должна помещать в HashMap пары считанные с клавиатуры.
Программа должна выводить на экран содержимое HashMap согласно условию. Ключ и значение разделены пробелом. Каждое значение с новой строки.
Solution.java
- Solution.java
package com.javarush.task.task10.task1019; import java.io.*; import java.util.HashMap; /* Функциональности маловато! Требования: 1. Программа должна считывать данные с клавиатуры. 2. Программа должна выводить текст на экран. 3. В методе main объяви переменную коллекции HashMap и сразу проинициализируй ee. 4. Программа должна помещать в HashMap пары считанные с клавиатуры. 5. Программа должна выводить на экран содержимое HashMap согласно условию. Ключ и значение разделены пробелом. Каждое значение с новой строки. */ public class Solution < public static void main(String[] args) throws IOException < BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); HashMap
Комментарии (25)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Уровень 20
19 февраля 2020, 22:03 полезный
Как уже подсказывали. Числа могут повторяться. Строки всегда уникальны. Сравни с этим : В мапе ключи уникальны, значения могут повторятся.
Уровень 24
20 февраля 2020, 19:02
Обратил на это внимание с самого начала, но в условии 2 раза повторятся «Программа вводит с клавиатуры пару (число и строку)» именно в этом порядке, подумал что может в этом и подвох. Цикл for как раз при вводе одинаковой строки считывал новую строку. Переписал код с новой мапой
while (true) String name; int id; try id = Integer.parseInt(reader.readLine()); > catch (NumberFormatException e) for (HashMap.EntryString, Integer> pair : map.entrySet()) System.out.println(pair.getKey() + " " + pair.getValue()); > break; > name = reader.readLine(); if (name.isEmpty()) // проверка на пустоту map.put(name, id); for (HashMap.EntryString, Integer> pair : map.entrySet()) System.out.println(pair.getKey() + " " + pair.getValue()); break; > > map.put(name, id); >
При вводе пустой строки на месте key и value теперь выводит содержимое на экран. Но если ввести число а на месте значения пустую строку, то число в мапу не добавляется и выводит содержимое с уже добавленными ранее парами. А в условии есть «Введенные данные не должны потеряться!» Думаю что в этом и есть загвоздка, только не могу понять как её решить
Уровень 20
20 февраля 2020, 20:08
Данные это пара — ключ, значение. Если чего-то нехватает то и добавлять нечего (видимо так). Если ключа нет, то к чему относится какое-то число? Мусор.
Уровень 24
20 февраля 2020, 20:15
а о чём тогда говорит условие что данные не должны потеряться? в остальном всё корректно работает (на мой взгляд) но видимо это не так
Уровень 24
20 февраля 2020, 20:26
Исправил очередность вывода на экран и изменилась рекомендация от ментора «Если после числа была введена пустая строка, это число также должно быть выведено на экран (не должно потеряться).»
Уровень 20
19 февраля 2020, 21:58
«..Попробовал завернуть считывание строки в try catch и при исключении делать break, тогда переменная i становится недостижима для метода map.put() «. Так обьяви переменные выше. Вообще не понимаю зачем for внутри while ( и что он делает) . Посмотри мой наверное неправильный но рабочий вариант. На его основе можна сделать проверку на isEmpty, nul, l при желании.
while (true) try id = Integer.parseInt(reader.readLine()); name = reader.readLine(); mps.put(name, id); > catch(Exception e) // System.out.println(e); break;> >
Уровень 41
19 февраля 2020, 18:56
Вот же у тебя в коде
if (name.equals(""))
Первым вводится точно такая же строка. А ещё для удобства есть метод isEmpty
Уровень 24
19 февраля 2020, 19:20
if (id.equals(""))
то Идея подчеркивает красным и в подсказках показывает это ‘equals()’ between objects of inconvertible types ‘Integer’ and ‘String’ isEmply по отношению к Integer тоже применять отказывается
Уровень 41
19 февраля 2020, 19:33
А как же ты пустую строку перед этим в число положить собираешься?
Уровень 24
19 февраля 2020, 19:44
Сделал вот так
String stringID = reader.readLine(); String name = reader.readLine(); .......... if (name.equals("") || stringID.equals("")) break; > int id = Integer.parseInt(stringID);
но это тоже не сработало
Уровень 41
19 февраля 2020, 19:50
Ну так если stringID пустая строка, то что должно попасть в name?
Уровень 24
19 февраля 2020, 20:07
Ничего? В условии же написано что пустая строка это конец ввода данных Но программа всё равно так не работает. При вводе например 123 qwe 321 ewq пустая строка — ничего не происходит пока я не введу ещё одну, т.е. программа не завершается а если ввести 123 qwe 321 ewq 435 пустая строка при выводе теряется 435 Ну это и понятно, ведь put.map находится после break А если поставить его до проверки if, то не работает потому что там stringID еще не int
Уровень 41
19 февраля 2020, 20:14
«Ничего?» — в том то и дело, что что-то попасть должно, а иначе программа не завершится. Прочитай stringID, проверь на пустоту, получи число, добавь в map.
Уровень 24
19 февраля 2020, 20:50
При изменении значения boolean на false в цикле while, цикл же всё равно должен пройти до конца, так ведь? Вот при проверке «числа» на пустоту добавил присвоение такой же пустой строчки к name, и вместо break — false. Но тоже ничего не получается
boolean toGo = true; while (toGo) String stringID =reader.readLine(); String name = reader.readLine(); .................... if (stringID.isEmpty()) name = ""; toGo = false; > if (name.isEmpty()) toGo = false; > int id = Integer.parseInt(stringID); map.put(id, name); >
Уровень 41
19 февраля 2020, 20:54
То что ты потом что-то добавишь, роли не играет, у тебя считывание name все равно идет ДО этого.
Уровень 24
19 февраля 2020, 21:14
а разве то что происходит после, не присваивает новое значение для переменной? Надо наверное сделать перерыв, а то уже мысль совсем не идёт в нужную сторону Не могу понять логику которая требуется При вводе пустого key, для завершения программы нужно присвоить какое-то значение и value? В свою же очередь при вводе числа и пустого value, програма завершится и выведет на экран содержимое map, включая введеный последним key или нет? Смущает условие «Введенные данные не должны потеряться!» но ведь в HashMap данные хранятся только в парах. Следовательно какая-то пара там должна быть. только вот какая и как её сделать?
Уровень 41
19 февраля 2020, 21:20
А как наступит «после», если у тебя программа не сдвинется с «сейчас»? Я уже задавал этот вопрос — что будет считываться в name? И у тебя мапа неправильно заполнятся, суть в подсказке «Числа могут повторяться. Строки всегда уникальны.» А дальше моё мнение расходится с большинством — я не считаю, что там есть тесты, когда пустая строка вводится вместо name.
Уровень 24
20 февраля 2020, 20:10
С проверкой вроде справился, так же поместил строки в ключи и числа в значения. Всё работает, кроме того, когда вводится число и пустая строка на месте значения, само число в мапу не добавляется. Как справится с этим? Пробовал делать String name = null; и перед break заносить всё таки пустое значение вместе с числом, но валидатор не устроило
while (true) String name; int id; try id = Integer.parseInt(reader.readLine()); > catch (NumberFormatException e) for (HashMap.EntryString, Integer> pair : map.entrySet()) System.out.println(pair.getKey() + " " + pair.getValue()); > break; > name = reader.readLine(); if (name.isEmpty()) map.put(name, id); for (HashMap.EntryString, Integer> pair : map.entrySet()) System.out.println(pair.getKey() + " " + pair.getValue()); break; > > map.put(name, id); >
Уровень 41
20 февраля 2020, 20:14
В данном случае я вижу проблемы только с выводом, а точнее его порядком.
Уровень 24
20 февраля 2020, 20:22
Исправил и изменилась рекомендация от ментора Если после числа была введена пустая строка, это число также должно быть выведено на экран (не должно потеряться).
Уровень 41
20 февраля 2020, 20:28 полезный
Ты посмотри, где у тебя второй break находится.
Уровень 24
20 февраля 2020, 20:35
Ура, получилось! По итогу понадобилось присвоить String name = null, убрать выводы на экран из try catch и if и поместить его вне цикла while Вы решили задачу лучше, чем 0% учеников. Вам удалось её решить с 38 попытки. Запомню я её на долго!) Спасибо огромное за помощь!
Уровень 27
20 февраля 2020, 20:36 полезный
По поводу расхождения мнений — у меня лично решение не проходило, пока не перенес добавление в мапу раньше проверки на пустоту. Значит, есть проверка с пустым ключом. Тоже в свое время задавал об этом вопрос. https://javarush.com/help/10539
Уровень 24
20 февраля 2020, 20:43
Думал о таком решении весь день, но при реализации проверку не прошло (из за того что при выводе ключ и значение были на не правильных местах) и сразу отбросил этот вариант. Я инициализировал name = null и в самой проверке на пустую строку добавил
put.map(name, id); break;
мне кажется что это и сработало
Уровень 38
14 сентября 2021, 14:47
Еще видел такую конструкцию для проверки строки на пустоту: string.trim().length() == 0; или string.trim().isEmpty(); где string — переменная типа String
- Курсы программирования
- Регистрация
- Курс Java
- Помощь по задачам
- Цены
- Задачи-игры
Сообщество
JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.
empty
Проверяет, считается ли переменная пустой. Переменная считается пустой, если она не существует или её значение равно false . empty() не генерирует предупреждение, если переменная не существует.
Список параметров
Если переменная не существует, предупреждение не генерируется. Это значит, что empty() фактически является точным эквивалентом конструкции !isset($var) || $var == false
Возвращаемые значения
Возвращает true , если параметр var не существует, если значение равно нулю, либо не задано, смотрите Преобразование в булев тип. В противном случае возвращает false .
Примеры
Пример #1 Простое сравнение empty() и isset() .
// Принимает значение true, потому что $var пусто
if (empty( $var )) echo ‘$var или 0, или пусто, или вообще не определена’ ;
>
// Принимает значение true, потому что $var определена
if (isset( $var )) echo ‘$var определена, даже если она пустая’ ;
>
?>
Пример #2 empty() и строковые индексы
$expected_array_got_string = ‘somestring’ ;
var_dump (empty( $expected_array_got_string [ ‘some_key’ ]));
var_dump (empty( $expected_array_got_string [ 0 ]));
var_dump (empty( $expected_array_got_string [ ‘0’ ]));
var_dump (empty( $expected_array_got_string [ 0.5 ]));
var_dump (empty( $expected_array_got_string [ ‘0.5’ ]));
var_dump (empty( $expected_array_got_string [ ‘0 Mostel’ ]));
?>?php
Результат выполнения данного примера:
bool(true) bool(false) bool(false) bool(false) bool(true) bool(true)
Примечания
Замечание: Поскольку это языковая конструкция, а не функция, она не может вызываться при помощи переменных функций или именованных аргументов.
Замечание:
При использовании функции empty() на недоступных (необъявленных) свойствах объекта будет вызван встроенный метод объекта __isset(), если он определён.
Смотрите также
- isset() — Определяет, была ли установлена переменная значением, отличным от null
- __isset()
- unset() — Удаляет переменную
- array_key_exists() — Проверяет, присутствует ли в массиве указанный ключ или индекс
- count() — Подсчитывает количество элементов массива или Countable объекте
- strlen() — Возвращает длину строки
- Таблица сравнения типов
User Contributed Notes 36 notes
9 years ago
$testCase = array(
1 => » ,
2 => «» ,
3 => null ,
4 => array(),
5 => FALSE ,
6 => NULL ,
7 => ‘0’ ,
8 => 0 ,
foreach ( $testCase as $k => $v ) if (empty( $v )) echo »
$k => $v is empty» ;
>
>
/**
Output
1=> is empty
2=> is empty
3=> is empty
4=>Array is empty
5=> is empty
6=> is empty
7=>0 is empty
8=>0 is empty
**/
?>
14 years ago
Please note that results of empty() when called on non-existing / non-public variables of a class are a bit confusing if using magic method __get (as previously mentioned by nahpeps at gmx dot de). Consider this example:
class Registry
protected $_items = array();
public function __set ( $key , $value )
$this -> _items [ $key ] = $value ;
>
public function __get ( $key )
if (isset( $this -> _items [ $key ])) return $this -> _items [ $key ];
> else return null ;
>
>
>
$registry = new Registry ();
$registry -> empty = » ;
$registry -> notEmpty = ‘not empty’ ;
var_dump (empty( $registry -> notExisting )); // true, so far so good
var_dump (empty( $registry -> empty )); // true, so far so good
var_dump (empty( $registry -> notEmpty )); // true, .. say what?
$tmp = $registry -> notEmpty ;
var_dump (empty( $tmp )); // false as expected
?>
The result for empty($registry->notEmpty) is a bit unexpeced as the value is obviously set and non-empty. This is due to the fact that the empty() function uses __isset() magic functin in these cases. Although it’s noted in the documentation above, I think it’s worth mentioning in more detail as the behaviour is not straightforward. In order to achieve desired (expexted?) results, you need to add __isset() magic function to your class:
class Registry
protected $_items = array();
public function __set ( $key , $value )
$this -> _items [ $key ] = $value ;
>
public function __get ( $key )
if (isset( $this -> _items [ $key ])) return $this -> _items [ $key ];
> else return null ;
>
>
public function __isset ( $key )
if (isset( $this -> _items [ $key ])) return ( false === empty( $this -> _items [ $key ]));
> else return null ;
>
>
>
$registry = new Registry ();
$registry -> empty = » ;
$registry -> notEmpty = ‘not empty’ ;
var_dump (empty( $registry -> notExisting )); // true, so far so good
var_dump (empty( $registry -> empty )); // true, so far so good
var_dump (empty( $registry -> notEmpty )); // false, finally!
?>
It actually seems that empty() is returning negation of the __isset() magic function result, hence the negation of the empty() result in the __isset() function above.
Как проверить переменную на пустоту c
Если переменная объявлена, но ей изначально не присвоено никакого значения (иначе говоря она не инициализирована), или если переменная вовсе неопределена, то нам будет проблематично ее использовать. Например:
При попытке вывести значение переменной мы получим диагностическое сообщение о том, что переменная не определена:
Warning: Undefined variable $a in C:\localhost\hello.php on line 10
Ситуация может показатся искуственной. Тем не менее нередко переменные в PHP получают некоторые данные извне, например, ввод пользователя. Соответственно возникает необходимость перед использованием данных проверить, что эти данные определены, что они имеются.
Для проверки существования переменной PHP предоставляет ряд встроенных функций.
Оператор isset
Функция isset() позволяет определить, инициализирована ли переменная или нет. Если переменная определена, то isset() возвращает значение true . Если переменная не определена, то isset() возвращает false . Также если переменная имеет значение null функция isset() также возвращает false .
Здесь переменная $message не инициализирована, поэтому выражение isset($message) будет возвращать значение false .
переменная message не определена
Теперь пусть переменная $message имеет начальное значение:
$message = "Hello PHP"; if(isset($message)) echo $message; else echo "переменная message не определена";
В этом случае выражение isset($message) будет возвращать true , поэтому будет выполняться инструкция echo $message :
Hello PHP
Однако если переменной присвоено начальное значение null , то опять же будет считаться, что эта переменная не установлена:
$message = null; if(isset($message)) echo $message; else echo "переменная message не определена";
переменная message не определена
empty
Функция empty() проверяет переменную на «пустоту». «Пустая» переменная — это переменная, значение которой равно null , 0, false или пустой строке — в этом случае функция empty() возвращает true :
Здесь переменная $message хранит пустую строку, поэтому выражение empty($message) возвратит true .
переменная message не определена
При этом если строка содержит даже хотя бы один пробел и больше ничего ( $message = » » ), то такая строка уже не считается пустой.
unset
С помощью функции unset() мы можем уничтожить переменную:
Но, как правило, необходимость в подобном удалении переменной возникает редко, так как PHP автоматически удаляет переменные, когда завершается выполнение контекста (например, функции), в котором определены эти переменные.
Проверка на пустоту по-человечески на JavaScript
В работе с js часто можно столкнуться с тем, что ты точно не знаешь пустая переменная или нет, но очень надо по ней пройтись через for или отправить на бэк.
Мы можем проверить массив или текст на длину и узнать, пустой он или нет, но как точно определить массив это или обьект?
Если мы напишем typeof, js ответит нам что и [] и <> обьекты
typeof <> // "object"
typeof [] // "object"
Для таких случаев я использую функцию проверки на пустоту, учитывая все моменты, которые могут пойти не по сценарию.
Первый пример
Представим, что нам нужно отправить форму на сервер используя js.
Мы знаем, что в форме есть поле имя , фамилия, номер телефона и вопрос.
Поля имя и номер телефона обязательные.
Возьмем простую форму отправки: