Предыдущий ответ, предлагающий 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)
.Однако я не уверен, стоит ли жертвовать читабельностью.