JAVA: разделитель удаляется при изменении строки - PullRequest
1 голос
/ 04 апреля 2020

Как включить разделитель при обращении строки с помощью приведенного ниже кода?

Pattern.compile(Pattern.quote("."))
       .splitAsStream("BCTVW.")
       .map(s->new StringBuilder(s).reverse())
       .collect(Collectors.joining("."))

Токовый выход: WVTCB.
Требуемый выход: .WVTCB

Разделитель отсутствует в требуемом выводе.

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

Pattern(regex).splitAsStream(data) имеет функциональность, аналогичную data.split(regex), поэтому также удаляет завершающие пустые строки, созданные в результате разделения .
Например, "a,b,".split(",") НЕ приведет к ["a","b",""], но ["a","b"] потому что пустые строки в конце массива будут удалены.

Наиболее существенное различие между Pattern#splitAsStream и String#split заключается в том, что метод String#split(regex) имеет перегружен версия String#split(regex, limit), где limit в зависимости от значения влияет на его результат.

Если предел равен

  • positive, он устанавливает максимальное количество элементов в результирующем массиве, например, "a,b,c,d".split(",", 3) приведет к ["a", "b", "c,d"].
  • 0 вызывает удаление завершающих пустых строк (split(regex,0) аналогично split(regex)
  • negative - предотвращает удаление split завершающего пустого строки - это то, что вам нужно.

Так что не используйте Pattern#splitAsStream, а вместо этого String#split метод, как вы пытались в своем предыдущем вопросе :

цитата на случай, если предыдущий вопрос будет удален

String fileContent = "Abc.134dsq";
String delimiter = ".";
fileContent = fileContent.replace(delimiter, "-");
String[] splitWords = fileContent.split("-");
StringBuilder stringBuilder = new StringBuilder();
for (String word : splitWords) {
    StringBuilder output = new StringBuilder(word).reverse();
    stringBuilder.append(output);
}

System.out.println(stringBuilder.toString());

Вещи, которые вам нужно исправить:

  1. НЕ ЗАМЕНЯЙТЕ delimiter в вашей строке на -, чтобы разделить на -, потому что ваша строка может содержать свои -. Например, "A.B-C" после замены . на - будет станьте A-B-C, что приведет к нежелательному разделению B-C.

    Вместо разделения используйте Pattern.quote(delimiter) - как вы сделали в примере, приведенном в текущем вопросе.

  2. Использование split с параметром отрицательного предела для предотвращения удаления висячих пустых строк (что-то вроде fileContent.split(Pattern(delimiter), -1))

  3. Вы не являетесь добавление разделителей обратно к результирующей строке. Простое решение - использовать StringJoiner joiner = new StringJoiner(delimiter); joiner.add(reversedElement) вместо StringBuilder, поскольку joiner.add также будет обрабатывать добавление разделителя между элементами, к которым мы хотим присоединиться.

1 голос
/ 04 апреля 2020

Вы можете использовать группы без захвата, например, lookahead.

Pattern.compile("(?<=\\.)")
             .splitAsStream("BCTVW.")
             .map(s->new StringBuilder(s).reverse())
             .collect(Collectors.joining("."));
...