我当前正在尝试遍历String
并标识该字符串中的特定字符,然后在最初标识的字符之后添加一个特定字符。
例如,使用字符串:aaaabbbcbbcbb 我想识别的字符是: c
因此,每次检测到c时,都会将以下c添加到字符串中,并且循环将继续。
因此 aaaabbbcbbcbb 将成为 aaaabbbccbbccbb 。
我一直在尝试使用indexOf()
,substring
和charAt()
,但是我现在要么用c覆盖其他字符,要么仅检测一个c。
答案 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+
但是,如果您坚持使用循环:
String inputString = "aaaabbbcbbcbb";
char charToDouble = 'c';
String result = "";
for(char c : inputString.toCharArray()){
result += c;
if(c == charToDouble){
result += c;
}
}
答案 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)
。但是,我不确定是否值得牺牲可读性。