Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.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 仅替换尚未替换的字符_Java_Replace_Char_Counter - Fatal编程技术网

Java 仅替换尚未替换的字符

Java 仅替换尚未替换的字符,java,replace,char,counter,Java,Replace,Char,Counter,我有一个关于替换某些字符的问题。 我有一个由x个字符组成的字符串,其中包含正常英语字母表中的所有字符 String x = "exampleString" 我的问题是,因为我要做的是替换这个字符串中的字符,所以我不能用用户替换,因为这会替换以前替换的字符串,例如 if(x.contains(e)){ x = x.replace("e","a") } 将替换上面字符串中的每个E字符 我还尝试使用: x=x.replace("e","a").replace("a","b") 但这也会替换每一

我有一个关于替换某些字符的问题。 我有一个由x个字符组成的字符串,其中包含正常英语字母表中的所有字符

String x = "exampleString"
我的问题是,因为我要做的是替换这个字符串中的字符,所以我不能用用户替换,因为这会替换以前替换的字符串,例如

if(x.contains(e)){
x = x.replace("e","a")
}
将替换上面字符串中的每个E字符

我还尝试使用:

x=x.replace("e","a").replace("a","b") 
但这也会替换每一个a字符,甚至是以前替换的字符。 我认为这是可行的,因为字符串在Java中是不可变的,但事实并非如此

我还考虑了计数器,以查看字符串何时被替换,并忽略被替换的字符串,但我无法实现这一点

有人能提出解决办法吗

问候 编程新手。

您可以尝试以下方法:

 // Your String
String str = "exampleString";

// Convert it to a Character array.
char[] strCharArr = str.toCharArray();

// Have a corresponding boolean array
boolean[] arrStr = new boolean[str.length()];

// Character to be replaced
char a = 'r';

// Character to be replaced with
char b = 's';        

// Loop through the array
for(int i = 0; i < strCharArr.length; i++) {

    // Check if the characted matches and have not been replaced before.
    if(strCharArr[i] == a && !arrStr[i]) {
        strCharArr[i] = b;
        arrStr[i] = true; 
    }
}
System.out.println(String.valueOf(strCharArr));

// Now if you need to replace again. 
a = 's';
b = 'a';        
for(int i = 0; i < strCharArr.length; i++) {
    if(strCharArr[i] == a && !arrStr[i]) {
       strCharArr[i] = b;
       arrStr[i] = true; 
    }
}

System.out.println(String.valueOf(strCharArr));

在此之后,可以将字符数组转换回相应的字符串。您可以编写一个函数,并根据需要多次替换它

问题是您对整个字符串执行了两次替换,使一个位置受到多次替换的影响。您需要一个只在字符串上循环一次的解决方案,这样用a替换的e就不会被b替换

String x = "exampleString";
StringBuilder buf = new StringBuilder(x);
for (int i = 0; i < buf.length(); i++)
{
    switch (buf.charAt(i))
    {
    case 'e':
        buf.setCharAt(i, 'a');
        break;
    case 'a':
        buf.setCharAt(i, 'b');
        break;
    }
}
System.out.println(buf.toString());

布尔[]arrStr的用途是什么?只有一个循环,并且该值在设置之后才被设置。@ScaryWombat更新了解释。更新了我的注释,仍然是unclear@ScaryWombat这一切都是假的。一旦它被替换,相应的布尔值将被设置为true。编辑得好-现在对于未来几代程序员来说很容易理解。除非您的映射是循环的,否则您可以反转它:x=x.replacea,b.replacea,a
axbmplaString