交换字符串中的两个字母

我想在一个字符串中交换两个字母。 例如,如果输入为WH那么字符串中W所有出现都应该被H替换,并且所有出现的H应该被W替换。 String WelloHorld将成为HelloWorld

我知道如何替换单个字符:

 str = str.replace('W', 'H'); 

但我无法弄清楚如何交换字符。

您可能需要三次替换调用才能完成此操作。

第一个将字符中的一个更改为中间值,第二个将第一个替换为中间值,第三个将第二个替换为第二个替换中间值。

 String str = "Hello World"; str = star.replace("H", "*").replace("W", "H").replace("*", "W"); 

编辑

回答下面关于交换String字符的这种方法的正确性的一些问题。 这将起作用,即使String已存在* 。 但是,这需要额外的步骤:在返回新String之前首先转义任何*并取消转义。

 public static String replaceCharsStar(String org, char swapA, char swapB) { return org .replace("*", "\\*") .replace(swapA, '*') .replace(swapB, swapA) .replaceAll("(? 

编辑2

在阅读了其他一些答案之后,一个新版本,不仅适用于Java 8,可以替换需要在正则表达式中转义的字符,例如[]并考虑到使用char原语操作String对象。

 public static String swap(String org, String swapA, String swapB) { String swapAEscaped = swapA.replaceAll("([\\[\\]\\\\+*?(){}^$])", "\\\\$1"); StringBuilder builder = new StringBuilder(org.length()); String[] split = org.split(swapAEscaped); for (int i = 0; i < split.length; i++) { builder.append(split[i].replace(swapB, swapA)); if (i != (split.length - 1)) { builder.append(swapB); } } return builder.toString(); } 
 public String getSwappedString(String s) { char ac[] = s.toCharArray(); for(int i = 0; i < s.length(); i++) { if(ac[i] == 'H') ac[i]='W'; else if(ac[i] == 'W') ac[i] = 'H'; } s = new String(ac); return s; } 

使用Java8,它真的很简单

 static String swap(String str, String one, String two){ return Arrays.stream(str.split(one, -1)) .map(s -> s.replaceAll(two, one)) .collect(Collectors.joining(two)); } 

用法示例:

 public static void main (String[] args){ System.out.println(swap("𐌰𐌱𐌲", "𐌰", "𐌲")); } 

我建议你不要使用一个Character作为交换函数,因为它会破坏包含BMP之外字母的字符串

如果你想扩展它以使用任意字符串(不仅仅是字母),你可以引用提供的字符串:

 static String swap(String str, String one, String two){ String patternOne = Pattern.quote(one); String patternTwo = Pattern.quote(two); return Arrays.stream(str.split(patternOne, -1)) .map(s -> s.replaceAll(patternTwo, one)) .collect(Collectors.joining(two)); } 

一个稍微好一点的字符串扫描方法,没有显式数组和索引访问:

 StringBuilder sb = new StringBuilder(); for (char c : source_string.toCharArray()) { if (c == 'H') sb.append("W"); else if (c == 'W') sb.append("H"); else sb.append(c); } return sb.toString(); 

您可以迭代String的字符数组,并在看到任何一个字符时进行交换:

 private static String swap(String str, char one, char two) { char[] chars = str.toCharArray(); for (int i = 0; i < chars.length; i++) { if (chars[i] == one) { chars[i] = two; } else if (chars[i] == two) { chars[i] = one; } } return String.valueOf(chars); } 

你也可以尝试这个代码。

 System.out.println("WelloHorld".replaceAll("W", "H~").replaceAll("H(?!~)", "W").replaceAll("(?<=H)~", "")); 

输出:

 HelloWorld 

使用输入字符串中不存在的任何字符而不是~