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

时间:2018-10-24 11:19:53

标签: java loops for-loop substring indexof

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

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

因此,每次检测到c时,都会将以下c添加到字符串中,并且循环将继续。

因此 aaaabbbcbbcbb 将成为 aaaabbbccbbccbb

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

4 个答案:

答案 0 :(得分:3)

我知道您已请求循环,但替换就不会那么简单吗?

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.

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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