Как преобразовать поток символов в String? [Дубликат]

Проблема заключается в методе 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();
16
задан Tagir Valeev 13 August 2015 в 02:22
поделиться

3 ответа

Вот ответ на вторую часть вопроса. Если у вас есть 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.

10
ответ дан Community 28 August 2018 в 08:41
поделиться

Метод 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);
6
ответ дан Sleiman Jneidi 28 August 2018 в 08:41
поделиться

К сожалению, такой сценарий плохо поддерживается 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();
4
ответ дан Tagir Valeev 28 August 2018 в 08:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: