【问题标题】:Replace only characters that haven't been replaced [duplicate]仅替换尚未替换的字符[重复]
【发布时间】:2018-11-21 00:01:20
【问题描述】:

我有一个关于替换某些字符的问题。 我有一串x个字符,其中包含普通英文字母表中的所有字符。

String x = "exampleString"

我的问题是,因为我想做的是替换此字符串中的字符,所以我无法用户替换,因为这替换了以前替换的字符串,例如。

if(x.contains(e)){
x = x.replace("e","a")
}

这将替换上面字符串中的每个 E 字符。

我也在尝试使用:

x=x.replace("e","a").replace("a","b") 

但这也将替换每个字符,即使是以前替换的字符。 我虽然这会起作用,因为字符串在 Java 中是不可变的,但它不是。

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

任何人都可以提出解决方案吗?

问候 编程新手。

【问题讨论】:

  • 除非您的映射是循环的,否则您可以反转它:x=x.replace("a","b").replace("e","a")

标签: java replace char counter


【解决方案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));

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

【讨论】:

  • boolean[] arrStr有什么用,只有一个循环,设置后才设置值。
  • @ScaryWombat 更新了解释。
  • 更新了我的评论,还不清楚
  • @ScaryWombat 这一切都是假的。一旦它被替换,相应的布尔值将被设置为 true。
  • 很好的编辑 - 现在它很容易被后代程序员理解。
【解决方案2】:

问题是您要对整个字符串执行两次替换,从而使一个位置受到多次替换。您需要一个只在字符串上循环一次的解决方案,这样被“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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 2021-02-02
    • 1970-01-01
    • 2014-06-25
    相关资源
    最近更新 更多