Java字符开关

时间:2011-02-15 21:21:31

标签: java string

在Java中切换字符的简单方法是什么?说我有以下内容:

String testString = "Hello World.";

// I know this doesn't work
testString = testString.replace('o', 'e');

我想用'o'切换'e',我知道这不会有效......请让我知道我需要做什么

6 个答案:

答案 0 :(得分:8)

 String testString = "Hello World.";
 String replacedString = testString.replaceAll("o", "~")
                                   .replaceAll("e","o")
                                   .replaceAll("~","e");

好的,只要你的字符串没有〜

答案 1 :(得分:1)

一个简单的解决方案是使用临时字符:

testString = testString.replace('o', '@');
testString = testString.replace('e', 'o');
testString = testString.replace('@', 'e');

这可能是理想的,也可能不是理想的,具体取决于字符串中可能的字符范围,长度和需要执行的次数。但对于示例字符串,它确实有效: - )

答案 2 :(得分:1)

您可以构建自己的方法来实现这一目标。

String SwitchCharOcurrences(String original, char x, char y) {
    char[] cArray = original.toCharArray();
    for(int i = 0; i < cArray.length; i++) {
        if(cArray[i] == x) {
            cArray[i] = y;
        } else if(cArray[i] == y) {
            cArray[i] = x;
        }
    }
    String result = new String (cArray);
    return result;
}

答案 3 :(得分:0)

没有单一的方法调用。

StringBuilder buf = new StringBuilder();
for(char c : testString.toCharArray()) // CharSequence should really be usable in such a loop
{
   switch(c) {
      case 'e': c = 'o'; break;
      case 'o': c = 'e'; break;
   }
    buf.append(c);
}
testString = buf.toString();

规范版本是这样的:

StringBuilder buf = new StringBuilder();

for(int i = 0; i <testString.length(); i++)
{
   char c = testString.charAt(i);
   switch(c) {
      case 'e': c = 'o'; break;
      case 'o': c = 'e'; break;
   }
    buf.append(c);
}
testString = buf.toString();

有人可以根据不同的字符串长度对这两个版本进行基准测试吗?

答案 4 :(得分:0)

您可以遍历字符串并通过检查每个字符来构建替换字符串。像这样:

String testString = "Hello World.";
StringBuilder sb = new StringBuilder();
for (int i=0, length=testString.length(); i<length; i++) {
    char ch = testString.charAt(i);
    switch (ch) {
          case 'e':
              sb.append('o');
              break;
          case 'o':
              sb.append('e');
              break;
          default:
              sb.append(ch);
    }
}
String replacedString = sb.toString();

如果你想交换大写字母,你也可以这样做:

String testString = "Hello World.";
StringBuilder sb = new StringBuilder();
for (int i=0, length=testString.length(); i<length; i++) {
    char ch = testString.charAt(i);
    switch (ch) {
          case 'e':
              sb.append('o');
              break;
          case 'E':
              sb.append('O');
              break;
          case 'o':
              sb.append('e');
              break;
          case 'O':
              sb.append('E');
              break;
          default:
              sb.append(ch);
    }
}
String replacedString = sb.toString();

但是switch语句开始变得有点长而且凌乱。如果你需要添加更多,它可能会失控。一点点重构可能会导致这种情况:

String testString = "Hello World.";

Map<Character,Character> replacementMap = new HashMap<Character,Character>();
replacementMap.put('e', 'o');
replacementMap.put('o', 'e');
replacementMap.put('E', 'O');
replacementMap.put('O', 'E');

StringBuilder sb = new StringBuilder();
for (int i=0, length=testString.length(); i<length; i++) {
    char ch = testString.charAt(i);
    Character replacement = replacementMap.get(ch);
    sb.append(replacement != null ? replacement : ch);
}
String replacedString = sb.toString();

答案 5 :(得分:-1)

这可能不是最佳的,但相对容易;)

String testString = "Hello World.";

testString = testString.replace('o', '\u0001');
testString = testString.replace('e', 'o');
testString = testString.replace('\u0001', 'e');

我们的想法是选择一个你确定不会在字符串中使用的字符并将其用作临时替换。