仅替换未替换的字符

时间:2018-11-21 00:01:20

标签: 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") 

但这也将替换每个字符,即使以前替换过。 我虽然可以用,因为字符串在Java中是不可变的,但事实并非如此。

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

有人可以建议解决方案吗?

问候 编程新手。

2 个答案:

答案 0 :(得分:1)

您可以尝试以下方法:

 // 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));

此后,您可以将字符数组转换回相应的字符串。您可以编写一个函数并将其替换多次。

答案 1 :(得分:0)

问题是您要对整个字符串执行两次替换,因此一个位置要进行多次替换。您需要一个只对字符串循环一次的解决方案,以免被“ 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());

这使用StringBuilder来实现可变性,并绕过replace方法。无需跟踪已被替换的内容。每个字符最多只能执行一次替换。运行时输出:

axbmplaString