如何 - 遍历字符串并识别特定字符并添加到字符串

How to - Loop through a String and identify a specific character and add to the string

我目前正在尝试遍历 String 并识别该字符串中的特定字符,然后在最初识别的字符之后添加一个特定字符。

例如使用字符串:aaaabbbcbbcbb 我要识别的字符是:c

因此,每次检测到一个c,都会将后面的c添加到字符串中,并继续循环。

这样 aaaabbbcbbcbb 就会变成 aaaabbbccbbccbb.

我一直在尝试使用 indexOf()substringcharAt(),但我目前要么用 c 覆盖其他字符,要么只检测一个 c。

遍历所有字符。将每个添加到 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

您可能正在尝试修改 java 中的字符串。 Java 中的字符串是 immutable,不能像 c++ 中那样更改。

您可以使用StringBuilder 来插入字符。例如:

StringBuilder builder = new StringBuilder("acb");
builder.insert(1, 'c');

我知道您要求循环,但像替换这样简单的东西还不够吗?

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

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

Try it online.

如果您坚持使用循环:

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

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

Try it online.

之前的回答建议 String.replace 是最佳解决方案,但如果您需要以其他方式进行(例如练习),那么这里有一个 'modern' 解决方案:

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)。但是,我不确定是否值得牺牲可读性。