簡體   English   中英

在字符串中交換兩個字母

[英]Swap two letters in a string

我想在一個字符串中交換兩個字母。 例如,如果輸入為WH那么字符串中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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM