如何 - 遍历字符串并识别特定字符并添加到字符串
How to - Loop through a String and identify a specific character and add to the string
我目前正在尝试遍历 String
并识别该字符串中的特定字符,然后在最初识别的字符之后添加一个特定字符。
例如使用字符串:aaaabbbcbbcbb
我要识别的字符是:c
因此,每次检测到一个c,都会将后面的c添加到字符串中,并继续循环。
这样 aaaabbbcbbcbb 就会变成 aaaabbbccbbccbb.
我一直在尝试使用 indexOf()
、substring
和 charAt()
,但我目前要么用 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+
如果您坚持使用循环:
String inputString = "aaaabbbcbbcbb";
char charToDouble = 'c';
String result = "";
for(char c : inputString.toCharArray()){
result += c;
if(c == charToDouble){
result += c;
}
}
之前的回答建议 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)
。但是,我不确定是否值得牺牲可读性。
我目前正在尝试遍历 String
并识别该字符串中的特定字符,然后在最初识别的字符之后添加一个特定字符。
例如使用字符串:aaaabbbcbbcbb 我要识别的字符是:c
因此,每次检测到一个c,都会将后面的c添加到字符串中,并继续循环。
这样 aaaabbbcbbcbb 就会变成 aaaabbbccbbccbb.
我一直在尝试使用 indexOf()
、substring
和 charAt()
,但我目前要么用 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+
如果您坚持使用循环:
String inputString = "aaaabbbcbbcbb";
char charToDouble = 'c';
String result = "";
for(char c : inputString.toCharArray()){
result += c;
if(c == charToDouble){
result += c;
}
}
之前的回答建议 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)
。但是,我不确定是否值得牺牲可读性。