如何替换序列中的非ASCII字符?

时间:2017-07-06 18:52:44

标签: java string unicode ascii

基本上,这段代码的作用是:

  • 接受输入。
  • 将长度大于2的每个字符序列替换为字符重复的次数和字符本身(例如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ØØØ

为什么会这样?

此外,有没有比我现在这样做更好的方法呢?

1 个答案:

答案 0 :(得分:4)

您正在使用==比较Character的实例,这将无法按预期工作,因为运算符会比较对象引用而不是值。

一个简单的快速解决方法是将for循环更改为:

for (char c : dataChars) {
}

注意类型的更改(Character to char)。这种方式charType在与c进行比较时会自动取消装入原始 char

另一个解决方案是将每个c == charType替换为c.equals(charType),以便不比较引用,而是比较值。