Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何替换序列中的非ASCII字符?_Java_String_Unicode_Ascii - Fatal编程技术网

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

Java 如何替换序列中的非ASCII字符?,java,string,unicode,ascii,Java,String,Unicode,Ascii,本质上,此代码的作用是: 接受输入 将长度大于2的每个字符序列替换为该字符的重复次数和字符本身(例如jjkkklll=3j5k4l)。输入不包含任何数值 返回结果 守则: private String replaceConsecutiveChars(String data) { char[] dataChars = data.toCharArray(); int i = 0; int k = 0; Character charType = null;

本质上,此代码的作用是:

  • 接受输入
  • 将长度大于2的每个字符序列替换为该字符的重复次数和字符本身(例如
    jjkkklll
    =
    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(""));
}
专用字符串替换连续字符(字符串数据){
char[]dataChars=data.tocharray();
int i=0;
int k=0;
Character charType=null;
for(字符c:数据字符){
如果(k==dataChars.length-1&&i>=2){
data=data.replace(重复(String.valueOf(charType),++i),(i+Character.toString(charType));
打破
}
如果(i==0){
charType=c;
i++;
}else if(c==图表类型){
i++;
}如果(c!=ChartType&&i>2),则为else{
data=data.replace(重复(String.valueOf(charType),i),(i+Character.toString(charType));
i=1;
charType=c;
}else if(c!=charType&&is).limit(n.collect)(收集器.连接(“”));
}
但是,我的实现似乎只适用于有限的ASCII字符集,但我正在尝试使其适用于Unicode字符集。例如:

  • 输入的
    ddddddddkkkk pppp
    将正确输出
    8d5k4p
  • 输入的代码将错误地输出代码
  • 输入的
    “rrrrrÌÌÌÌÌkkkØØØ”
    将错误地输出
    5rÌÌÌ4kØØ
为什么会这样


此外,有没有比现在更好的方法来执行此操作?

您正在使用
==
比较角色实例,这将无法按预期工作,因为操作符比较对象引用而不是值

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

for (char c : dataChars) {
}
请注意类型(从字符到字符)的变化。这样,当将
charType
c
进行比较时,它会自动取消绑定到基本字符


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

为什么要使用字符包装类?这样我就可以使用
null
。你唯一使用的地方就是你在循环中保存的字符。这似乎很愚蠢。为什么不使用字符并在开始时将其赋值为“1”,因为你知道你永远不会在循环中循环一个数字?