Как - перебрать строку, определить конкретный символ и добавить в строку - PullRequest
0 голосов
/ 24 октября 2018

В настоящее время я пытаюсь перебрать String и идентифицировать определенный символ в этой строке, а затем добавить определенный символ, следующий за первоначально идентифицированным символом.

Например, с использованием строки : aaaabbbcbbcbb И символ, который я хочу идентифицировать: c

Так что каждый разОбнаружен ac, к строке будет добавлено следующее c, и цикл продолжится.

Таким образом, aaaabbbcbbcbb станет aaaabbbccbbccbb .

Я пытался использовать indexOf(), substring и charAt()но в настоящее время я либо перезаписываю другие символы с помощью ac, либо определяю только один c.

Ответы [ 4 ]

0 голосов
/ 24 октября 2018

Предыдущий ответ, предлагающий String.replace, является лучшим решением, но если вам нужно сделать это каким-то другим способом (например, для упражнения), то вот «современное» решение:

public static void main(String[] args) {
    final String inputString = "aaaabbbcbbcbb";
    final int charToDouble = 'c';  // A Unicode codepoint
    final String result = inputString.codePoints()
            .flatMap(c -> c == charToDouble ? IntStream.of(c, c) : IntStream.of(c))
            .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
            .toString();
    assert result.equals("aaaabbbccbbccbb");
}

Этосмотрит на каждого персонажа по очереди (в IntStream).Он удваивает символ, если он соответствует цели.Затем он накапливает каждый символ в StringBuilder.

Может быть выполнена микрооптимизация для предварительного выделения емкости StringBuilder.Мы знаем, что максимально возможный размер новой строки в два раза больше старой строки, поэтому StringBuilder::new можно заменить на () -> new StringBuilder(inputString.length()*2).Однако я не уверен, стоит ли жертвовать читабельностью.

0 голосов
/ 24 октября 2018

Возможно, вы пытаетесь изменить строку в Java.Строки в Java immutable и не могут быть изменены, как в c++.

Вы можете использовать StringBuilder для вставки символов.например:

StringBuilder builder = new StringBuilder("acb");
builder.insert(1, 'c');
0 голосов
/ 24 октября 2018

Я знаю, что вы просили цикл, но разве не хватит чего-то такого простого, как замена?

String inputString = "aaaabbbcbbcbb";
String charToDouble = "c";

String result = inputString.replace(charToDouble, charToDouble+charToDouble);
// or `charToDouble+charToDouble` could be `charToDouble.repeat(2)` in JDK 11+

Попробуйте онлайн.

Если вы настаиваете на использовании петли, однако:

String inputString = "aaaabbbcbbcbb";
char charToDouble = 'c';

String result = "";
for(char c : inputString.toCharArray()){
  result += c;
  if(c == charToDouble){
    result += c;
  }
}

Попробуйте онлайн.

0 голосов
/ 24 октября 2018

Итерация по всем персонажам.Добавьте каждый к StringBuilder.Если он соответствует искомому символу, добавьте его снова.

final String test = "aaaabbbcbbcbb";
final char searchChar = 'c';

final StringBuilder builder = new StringBuilder();
for (final char c : test.toCharArray())
{
    builder.append(c);
    if (c == searchChar)
    {
        builder.append(c);
    }
}
System.out.println(builder.toString());

Вывод

aaaabbbccbbccbb

...