【问题标题】:How to swap String characters in Java?如何在 Java 中交换字符串字符?
【发布时间】:2023-03-19 14:56:02
【问题描述】:

如何在String 中交换两个 字符?例如,"abcde" 将变为 "bacde"

【问题讨论】:

  • 请记住你必须返回一个新的字符串,因为java字符串是不可变的。

标签: java string swap


【解决方案1】:

由于String 对象是不可变的,通过toCharArray 转到char[],交换字符,然后通过String(char[]) 构造函数从char[] 创建一个新的String

以下示例交换第一个和第二个字符:

String originalString = "abcde";

char[] c = originalString.toCharArray();

// Replace with a "swap" function, if desired:
char temp = c[0];
c[0] = c[1];
c[1] = temp;

String swappedString = new String(c);

System.out.println(originalString);
System.out.println(swappedString);

结果:

abcde
bacde

【讨论】:

  • 不错。不知道为什么我直接使用 StringBuilder 而不是考虑 char 数组。
  • @Jon Skeet:我的第一个想法实际上是建立一个新的字符串,但由于要求是交换,所以我认为 char 数组会更容易。 :)
  • 补充一点,String 类使用 char[] 在内部保存其字符串数据。这可以从浏览 OpenJDK 的源代码中看出。所以它可能是老式的,但是在String类本身中使用了数组。
  • 非常好!我喜欢你如何做到这一点没有 StringBuilder
【解决方案2】:

'在'一个字符串,你不能。字符串是不可变的。您可以轻松地创建第二个字符串:

 String second = first.replaceFirst("(.)(.)", "$2$1");

【讨论】:

  • 我喜欢你的正则表达式的样子。
【解决方案3】:

这已经回答了好几次了,但这里还有一个只是为了好玩:-)

public class Tmp {
    public static void main(String[] args) {
        System.out.println(swapChars("abcde", 0, 1));
    }
    private static String swapChars(String str, int lIdx, int rIdx) {
        StringBuilder sb = new StringBuilder(str);
        char l = sb.charAt(lIdx), r = sb.charAt(rIdx);
        sb.setCharAt(lIdx, r);
        sb.setCharAt(rIdx, l);
        return sb.toString();
    }
}

【讨论】:

    【解决方案4】:
    static String  string_swap(String str, int x, int y)
    {
    
        if( x < 0 || x >= str.length() || y < 0 || y >= str.length())
        return "Invalid index";
    
        char arr[] = str.toCharArray();
        char tmp = arr[x];
        arr[x] = arr[y];
        arr[y] = tmp;
    
        return new String(arr);
    }
    

    【讨论】:

      【解决方案5】:
      StringBuilder sb = new StringBuilder("abcde");
      sb.setCharAt(0, 'b');
      sb.setCharAt(1, 'a');
      String newString = sb.toString();
      

      【讨论】:

        【解决方案6】:

        String.toCharArray() 会给你一个代表这个字符串的字符数组。

        您可以在不更改原始字符串的情况下更改此设置(交换您需要的任何字符),然后使用String(char[]) 创建一个新字符串。

        注意字符串是不可变的,所以你必须创建一个新的字符串对象。

        【讨论】:

          【解决方案7】:

          这是用于递归交换 java 字符的 java 示例代码。您可以在 http://java2novice.com/java-interview-programs/string-reverse-recursive/ 获得完整的示例代码

          public String reverseString(String str){
          
              if(str.length() == 1){
                  return str;
              } else {
                  reverse += str.charAt(str.length()-1)
                          +reverseString(str.substring(0,str.length()-1));
                  return reverse;
              }
          }
          

          【讨论】:

            【解决方案8】:

            String.replaceAll() 或 replaceFirst()

            String s = "abcde".replaceAll("ab", "ba")
            

            链接到 JavaDocs String API

            【讨论】:

            • 这假设您会提前知道要交换的字符,这在大多数情况下似乎不是一个可用的解决方案。
            【解决方案9】:

            这是一个带有StringBuilder 的解决方案。它支持使用填充字符填充字符串长度不均匀的结果字符串。正如您已经猜到的那样,此方法用于十六进制半字节交换。

            /**
             * Swaps every character at position i with the character at position i + 1 in the given
             * string.
             */
            public static String swapCharacters(final String value, final boolean padding)
            {
               if ( value == null )
               {
                  return null;
               }
            
               final StringBuilder stringBuilder = new StringBuilder();
               int posA = 0;
               int posB = 1;
               final char padChar = 'F';
            
               // swap characters
               while ( posA < value.length() && posB < value.length() )
               {
                  stringBuilder.append( value.charAt( posB ) ).append( value.charAt( posA ) );
                  posA += 2;
                  posB += 2;
               }
            
               // if resulting string is still smaller than original string we missed the last
               // character
               if ( stringBuilder.length() < value.length() )
               {
                  stringBuilder.append( value.charAt( posA ) );
               }
            
               // add the padding character for uneven strings
               if ( padding && value.length() % 2 != 0 )
               {
                  stringBuilder.append( padChar );
               }
            
               return stringBuilder.toString();
            }
            

            【讨论】:

              【解决方案10】:
              public static String shuffle(String s) {
                  List<String> letters = Arrays.asList(s.split(""));
                  Collections.shuffle(letters);
                  StringBuilder t = new StringBuilder(s.length());
                  for (String k : letters) {
                      t.append(k);
                  }
                  return t.toString();
              }
              

              【讨论】:

                【解决方案11】:

                我认为这应该会有所帮助。

                import java.util.*;
                
                public class StringSwap{
                
                public static void main(String ar[]){
                    Scanner in = new Scanner(System.in);
                    String s = in.next();
                    System.out.println(new StringBuffer(s.substring(0,2)).reverse().toString().concat(s.substring(2)));
                  }
                }
                

                【讨论】:

                  【解决方案12】:
                  s = s.substring(0, firstChar)
                              +s.charAt(secondChar)
                              +s.substring(firstChar + 1, secondChar)
                              +s.charAt(firstChar)
                              +s.substring(secondChar+1);
                  

                  【讨论】:

                  • 请在您的回复中添加一些文字说明。只有代码响应可能不是很清楚。什么是firstCharsecondChar...?此外,可能是一个最小的工作示例是一个很好的响应选择
                  • firstChar 和 secondChar 表示正在交换的字符串的索引
                  【解决方案13】:
                  //this is a very basic way of how to order a string alpha-wise, this does not use anything fancy and is great for school use
                  
                  package string_sorter;
                  
                  public class String_Sorter {
                  
                      /**
                       * @param args the command line arguments
                       */
                      public static void main(String[] args) {
                  
                          String word = "jihgfedcba";
                          for (int endOfString = word.length(); endOfString > 0; endOfString--) {
                  
                              int largestWord = word.charAt(0);
                              int location = 0;
                              for (int index = 0; index < endOfString; index++) {
                  
                                  if (word.charAt(index) > largestWord) {
                  
                                      largestWord = word.charAt(index);
                                      location = index;
                                  }
                              }
                  
                              if (location < endOfString - 1) {
                  
                                  String newString = word.substring(0, location) + word.charAt(endOfString - 1) + word.substring(location + 1, endOfString - 1) + word.charAt(location);
                                  word = newString;
                              }
                              System.out.println(word);
                          }
                  
                          System.out.println(word);
                      }
                  
                  }
                  

                  【讨论】:

                    【解决方案14】:
                    private static void interchangeSpecificCharInString(String originalStr, String inter1, String inter2) {
                            List<Character> characterList = new ArrayList<>();
                    
                            for (char c : originalStr.toCharArray()) {
                                characterList.add(c);
                            }
                    
                            int index1 = characterList.indexOf(inter1.charAt(0));
                            int index2 = characterList.indexOf(inter2.charAt(0));
                    
                            characterList.set(index1, inter2.charAt(0));
                            characterList.set(index2, inter1.charAt(0));
                    
                            StringBuilder sb = new StringBuilder();
                            for (char c : characterList) {
                                sb.append(c);
                            }
                    
                            System.out.println(sb.toString());
                        }
                    

                    如果您要传递的字符串是“Random”,那么您想交换“R”和“m”,那么这里 originalStr 将是 Random,inter1 将是 R,inter2 将是 m。

                    【讨论】:

                      【解决方案15】:
                      import java.io.*;
                      class swaping
                      {
                           public static void main(String args[]) 
                           {
                               String name="premkumarg";
                               int len=name.length();
                               char[] c = name.toCharArray();
                               for(int i=0;i<len-1;i=i+2)
                               {
                                   char temp= c[i];
                                   c[i]=c[i+1];
                                   c[i+1]=temp;
                               }
                      
                               System.out.println("Swapping string is: ");
                               System.out.println(c);
                      
                          }
                      }
                      

                      【讨论】:

                        【解决方案16】:

                        以下代码行将交换str 中的前两个字符:

                        return str.charAt(1) + str.charAt(0) + str.substring(2);
                        

                        【讨论】:

                        • 请也添加一些解释,而不仅仅是一行代码?
                        • 这会产生完全错误的结果。提示:同等优先级的计算运算符在 Java 中是左关联的,就像在几乎所有编程语言中一样。
                        • //你可以这样做...提示:如果字符串长度大于 2,该代码可以工作 >>>>>>>> >>>>>>>>>>>>> >> 打包到.pkgtry;导入 java.util.Scanner;公共类 ToTry { public static String swap(String str) { String ret = "" + str.charAt(1) + str.charAt(0) + str.substring(2) ;返回 ret ; } public static void main(String[] args) { String s = swap("abcg") ; System.out.println(s); } }
                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2014-06-28
                        • 1970-01-01
                        • 1970-01-01
                        • 2010-11-17
                        • 1970-01-01
                        相关资源
                        最近更新 更多