[英]Swap two letters in a string
我想在一個字符串中交換兩個字母。 例如,如果輸入為W
和H
那么字符串中W
所有出現都應該被H
替換,並且所有出現的H
應該被W
替換。 String WelloHorld
將成為HelloWorld
。
我知道如何替換單個字符:
str = str.replace('W', 'H');
但我無法弄清楚如何交換字符。
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));
}
您可能需要三次替換調用才能完成此操作。
第一個將字符之一更改為中間值,第二個將第一個替換為第二個,第三個將第二個替換為第二個替換中間值。
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("(?<!\\\\)\\*", "" + swapB)
.replace("\\*", "*");
}
編輯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();
}
一個稍微好一點的字符串掃描方法,沒有顯式數組和索引訪問:
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
使用輸入字符串中不存在的任何字符而不是~
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.