基本上,这段代码的作用是:
jjjkkkkkllll
= 3j5k4l
)。输入不包含任何数值。代码:
private String replaceConsecutiveChars(String data) {
char[] dataChars = data.toCharArray();
int i = 0;
int k = 0;
Character charType = null;
for(Character c : dataChars) {
if(k == dataChars.length - 1 && i >= 2) {
data = data.replace(repeat(String.valueOf(charType), ++i), (i + Character.toString(charType)));
break;
}
if(i == 0) {
charType = c;
i++;
}else if(c == charType) {
i++;
}else if(c != charType && i > 2) {
data = data.replace(repeat(String.valueOf(charType), i), (i + Character.toString(charType)));
i = 1;
charType = c;
}else if(c != charType && i <= 2) {
i = 1;
charType = c;
}
k++;
}
return data;
}
private String repeat(String s, int n) {
return Stream.generate(() -> s).limit(n).collect(Collectors.joining(""));
}
但是,我的实现似乎只适用于有限的ASCII字符集,但我试图使用Unicode字符集。例如:
ddddddddkkkkkpppp
将正确输出8d5k4p
。êêêêÌÌÌÌÌÌÌØØØ
将错误地输出êêêêÌÌÌÌÌÌÌØØØ
"rrrrrêêêêÌÌÌÌÌkkkkØØØ"
将错误地输出5rêêêêÌÌÌÌÌ4kØØØ
为什么会这样?
此外,有没有比我现在这样做更好的方法呢?
答案 0 :(得分:4)
您正在使用==
比较Character的实例,这将无法按预期工作,因为运算符会比较对象引用而不是值。
一个简单的快速解决方法是将for循环更改为:
for (char c : dataChars) {
}
注意类型的更改(Character to char)。这种方式charType
在与c
进行比较时会自动取消装入原始 char 。
另一个解决方案是将每个c == charType
替换为c.equals(charType)
,以便不比较引用,而是比较值。