Удалите пустые строки после разбиения StringBuilder на массив Java - PullRequest
0 голосов
/ 16 января 2019

Извините, если этот вопрос уже задавался, но я смог найти только результаты c #. Итак, у меня есть этот StringBuilder:

 StringBuilder sb = new StringBuilder(" 111     11 ");

и я хочу разбить его на массив, используя этот метод:

String[] ar = sb.toString().split(" ");

Как и ожидалось, в массиве результатов есть несколько пустых записей. У меня вопрос, могу ли я удалить эти пустые места непосредственно, когда я разделю StringBuilder, или я должен сделать это потом.

Ответы [ 5 ]

0 голосов
/ 16 января 2019

Если вы не хотите зависеть от каких-либо сторонних зависимостей и не хотите выполнять регулярное выражение фильтрации,

Вы можете сделать это в одну строку с API Java 8 Streams:

Arrays.stream(sb.toString().trim().split(" ")).filter(s-> !s.equals("")).map(s -> s.trim()).toArray();

Для подробной многострочной версии предыдущего:

Arrays.stream(sb.toString()
    .trim() // Trim the starting and ending whitespaces from string
    .split(" ")) // Split the regarding to spaces
    .filter(s-> !s.equals("")) // Filter the non-empty elements from the stream
    .map(s -> s.trim()) // Trim the starting and ending whitespaces from element
    .toArray(); // Collect the elements to object array

Вот рабочий код для демонстрации:

StringBuilder sb = new StringBuilder(" 111     11 ");
Object[] array = Arrays.stream(sb.toString().trim().split(" ")).filter(s-> !s.equals("")).map(s -> s.trim()).toArray();

System.out.println("(" + array[0] + ")");
System.out.println("(" + array[1] + ")");
0 голосов
/ 16 января 2019

Есть пара регулярных выражений, чтобы иметь дело с этим, я также предпочел бы метод @rzwitserloot, но если вы хотите увидеть больше.

Проверьте это здесь: Как разделить строку с любыми пробельными символами в качестве разделителей?

Гленатрон объяснил это:

На большинстве диалектов регулярных выражений есть набор удобных кратких описаний, которые вы можете использовать для такого рода вещей, - это хорошие помнить:

\ w - соответствует любому слову.

\ W - Соответствует любому несловесному символу.

\ s - соответствует любому пробелу.

\ S - Совпадает с любым символом, кроме пробелов.

\ d - соответствует любой цифре.

\ D - Совпадает с чем угодно, кроме цифр.

Поиск "Regex Cheatsheets" должен наградить вас множеством полезных резюме.

Благодаря Гленатрону

0 голосов
/ 16 января 2019

Я бы использовал guava для этого:

    String t = " 111     11 ";
    Splitter.on(Pattern.compile("\\s+"))
            .omitEmptyStrings()
            .split(t)
            .forEach(System.out::println);
0 голосов
/ 16 января 2019

Вы можете использовать готовое решение от Apache Commons . Вот пример:

StringBuilder sb = new StringBuilder(" 111     11 ");
String trimmedString = StringUtils.normalizeSpace(sb.toString());
String[] trimmedAr = trimmedString.split(" ");
System.out.println(Arrays.toString(trimmedAr));

Вывод: [111, 11].

0 голосов
/ 16 января 2019

split принимает регулярное выражение. Итак:

String[] ar = sb.toString().split("\\s+");

Строка \\s является регулярным выражением для «любого пробела», и + равен: 1 или более. Если вы хотите разделить только пробелы (а не переводы строк, табуляции и т. Д.), Попробуйте: String[] ar = sb.toString().split(" +");, что буквально: «разделить на один или несколько пробелов».

Этот прием работает практически для любого разделителя. Например, разделить запятыми? Попробуйте: .split("\\s*,\\s*"), то есть: 0 или более пробелов, запятая, затем 0 или более пробелов (и регулярные выражения занимают столько, сколько могут).

Обратите внимание, что этот трюк НЕ избавляет от начальных и конечных пробелов. Но чтобы сделать это, используйте отделку. Собираем все вместе:

String[] ar = sb.toString().trim().split("\\s+");

и для запятых:

String[] ar = sb.toString().trim().split("\\s*,\\s*");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...