Проблема заключается в методе input.nextInt () - он только считывает значение int. Поэтому, когда вы продолжаете чтение с помощью input.nextLine (), вы получаете ключ «\n» Enter. Поэтому, чтобы пропустить это, вы должны добавить input.nextLine (). Надеюсь, это должно быть ясно сейчас.
Попробуйте это так:
System.out.print("Insert a number: ");
int number = input.nextInt();
input.nextLine(); // This line you have to add (It consumes the \n character)
System.out.print("Text1: ");
String text1 = input.nextLine();
System.out.print("Text2: ");
String text2 = input.nextLine();
Вот ответ на вторую часть вопроса. Если у вас есть IntStream
в результате вызова string.chars()
, вы можете получить Stream<Character>
, выполнив кастинг на char
, а затем боксируя результат, вызвав mapToObj
. Например, вот как превратить String
в Set<Character>
:
Set<Character> set = string.chars()
.mapToObj(ch -> (char)ch)
.collect(Collectors.toSet());
Обратите внимание, что приведение к char
важно, чтобы результат в блоке был Character
вместо Integer
.
. Теперь большая проблема с обработкой данных char
или Character
заключается в том, что дополнительные символы представлены как суррогатные пары значений char
, поэтому любой алгоритм с сделками с отдельными char
значениями, вероятно, не удастся при представлении дополнительных символов.
(Может показаться, что дополнительные символы - это неясная функция Юникода, о которой нам не нужно беспокоиться, но насколько я знаю , все emoji являются дополнительными символами.)
Рассмотрим этот пример:
string.chars()
.filter(Character::isAlphabetic)
...
Это приведет к сбою, если будет представлена строка, содержащая кодовую точку U + 1D400 (Математическая полужирная капитализация A ). Эта кодовая точка представляется в виде суррогатной пары в строке, и ни значение суррогатной пары не является буквенным символом. Чтобы получить правильный результат, вам нужно будет сделать это:
string.codePoints()
.filter(Character::isAlphabetic)
...
Я рекомендую всегда использовать codePoints()
.
Теперь, учитывая IntStream
кодовых точек , как можно собрать его в строку? Ответ Sleiman Jneidi является разумным (+1), используя метод tr-arg collect()
IntStream
.
Вот альтернатива:
StringBuilder sb = ... ;
string.codePoints()
.filter(...)
.forEachOrdered(sb::appendCodePoint);
return sb.toString();
Это может быть немного более гибким, если у вас уже есть StringBuilder
, который вы используете для накопления строковых данных. Вам не нужно создавать новый StringBuilder
каждый раз, и вам не нужно впоследствии преобразовывать его в String
.
Метод chars
возвращает IntStream
. Вам просто не хватает коллектора
String s = "abc-de3-2fg";
String s1 = s.chars().filter(Character::isLetter)
.collect(StringBuilder::new,StringBuilder::appendCodePoint,StringBuilder::append)
.toString();
System.out.println(s1);
К сожалению, такой сценарий плохо поддерживается Java 8 Stream API. Моя библиотека StreamEx добавляет несколько вспомогательных методов для работы с такими потоками: IntStreamEx.charsToString()
, IntStreamEx.codePointsToString()
и IntStreamEx.toCharArray()
. Также я представил примитивные коллекторы, такие как IntCollector
, которые могут помочь в сборе примитивных потоков каким-то нетривиальным способом.
Вот как ваша задача может быть решена с помощью библиотеки StreamEx:
String result = IntStreamEx.ofChars(s).filter(Character::isLetter).charsToString();
Или с кодовыми точками:
String result = IntStreamEx.ofCodePoints(s)
.filter(Character::isLetter)
.codePointsToString();