Java字符开关

Java字符开关,java,string,Java,String,在Java中切换字符的真正简单方法是什么?假设我有以下几点: String testString = "Hello World."; // I know this doesn't work testString = testString.replace('o', 'e'); 我想把“e”换成“o”,我知道这行不通。。。请让我知道我需要做什么一个简单的解决方案是使用临时字符: testString = testString.replace('o', '@'); testString = tes

在Java中切换字符的真正简单方法是什么?假设我有以下几点:

String testString = "Hello World.";

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

我想把“e”换成“o”,我知道这行不通。。。请让我知道我需要做什么

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

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

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

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

testString = testString.replace('o', '@');
testString = testString.replace('e', 'o');
testString = testString.replace('@', 'e');
 String testString = "Hello World.";
 String replacedString = testString.replaceAll("o", "~")
                                   .replaceAll("e","o")
                                   .replaceAll("~","e");
这可能是理想的,也可能不是理想的,这取决于字符串中可能的字符范围、长度以及需要执行的次数。但对于示例字符串,它确实起作用:-

 String testString = "Hello World.";
 String replacedString = testString.replaceAll("o", "~")
                                   .replaceAll("e","o")
                                   .replaceAll("~","e");
好的,只要你的绳子没有~


好的,只要字符串中没有~

,您就可以构建自己的方法来实现这一点

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;
}

您可以构建自己的方法来实现这一点

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;
}

一个方法调用都没有

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

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

不能使用单个方法调用

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

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

您可以通过检查每个字符来循环字符串并构建替换字符串。大概是这样的:

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

您可以通过检查每个字符来循环字符串并构建替换字符串。大概是这样的:

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

这可能不是最优的,但相对容易

String testString = "Hello World.";

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

这样做的目的是获取一个您确信未在字符串中使用的字符,并将其用作临时替换。

这可能不是最佳选择,但相对容易

String testString = "Hello World.";

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


这样做的目的是获取一个您确定未在字符串中使用的字符,并将其用作临时替换。

您希望它对字符串中的所有字符都有效还是仅对第一次出现的字符有效?您如何知道它不起作用?如果不做你想做的,它会做什么?testString.replaceo,e?我测试过它,它会说“你好”。我要说Holle Werld。因此,基本上在每次发生时都会切换它们。这是可能的吗?您可以构建自己的方法来实现这一点。您希望它对字符串中的所有字符都有效还是只对第一次出现的字符有效?您如何知道它不起作用?如果不做你想做的,它会做什么?testString.replaceo,e?我测试过它,它会说“你好”。我要说Holle Werld。因此,基本上在每次发生时都会切换它们。这可能吗?您可以构建自己的方法来实现这一点。+1 for.replaceAll链接。您可能会尝试寻找一些更奇特的字符,但~对于示例来说很好。为什么它告诉我类型字符串中的方法replaceAllString,String不适用于参数char,char?+1 for.replaceAllChaining。人们可能会尝试寻找一些更奇特的字符,但是~在示例中很好。为什么它告诉我类型字符串中的方法replaceAllString,String不适用于参数char,char?不确定在将char数组作为构造函数中的参数发送时是否必须NULL终止字符串。在c中,字符数组中的空终止符用于指示字符串的结尾。在java中,所有数组都有一个用于相同目的的长度属性。因此,我们在java中不需要空终止符。不确定当您将字符数组作为构造函数中的参数发送时,是否必须空终止字符串。在c中,字符数组中的空终止符的目的是指示字符串的结尾。在java中,所有数组都有一个用于相同目的的长度属性。因此,java中不需要空终止符。toCharArray创建新数组并将字符串复制到AFAIR。最好用字符。@Alex:请测量一下。。。我主要使用ToCharray是因为它在这个for循环中更容易使用,但它也保存了多个单独的charAt调用。@Paulo,这不是我的-1同意应该测量的,但这是微优化。ToCharray创建新数组并将字符串复制到空中。最好用字符。@Alex:请测量一下。。。我主要使用ToCharray是因为它在这个for循环中更容易使用,但它也保存了多个单独的charAt调用。@Paulo,这不是我的-1同意应该测量的,但这是微优化。我不是那个否决你的人,但可能是因为replaceAll不接受字符,它需要一个字符
字符串。@proflux,很好的捕捉,谢谢:-最初它是替换的,然后我更改了它,但没有检查参数。现在已修复。我不是那个否决你的人,但可能是因为replaceAll不带字符,它带字符串。@proflux,捕捉良好,谢谢:-最初是replace,后来我更改了它,但没有检查参数。现在修好了。