1. 程式人生 > 程式設計 >使用位運算、值交換等方式反轉java字串(四種方法)

使用位運算、值交換等方式反轉java字串(四種方法)

使用位運算、值交換等方式反轉java字串(四種方法)

在本文中,我們將向您展示幾種在Java中將String型別的字串字母倒序的幾種方法。

  • StringBuilder(str).reverse()
  • char[]迴圈與值交換
  • byte迴圈與值交換apache-commons-lang3

如果是為了進行開發,請選擇StringBuilder(str).reverse()API。出於學習的目的,我們可以研究char[]byte方法,其中涉及到值互換和移位運算技術,這些技術對於瞭解StringBuilder(str).reverse()API黑匣子背後原理非常有幫助。

1. StringBuilder(str).reverse()

在Java中,我們可以使用StringBuilder(str).reverse()

使字串字母倒序。

public class ReverseString1 {

  public static void main(String[] args) {

    String str = "Reverse a String in Java";

    StringBuilder sb = new StringBuilder(str).reverse();

    System.out.println(sb.toString());

  }
}

輸出結果

avaJ ni gnirtS a esreveR

2.char[]

首先,我們將字串轉換為char陣列,並逐個迴圈char陣列,並使用temp變數交換值。

public class ReverseString2 {

  public static void main(String[] args) {

    String str = "Hello World";
    System.out.println(reverse(str));     // dlroW olleH

  }

  public static String reverse(String input) {

    if (input == null || input.length() < 0)
      throw new IllegalArgumentException("Please provide an input!");

    char[] result = input.toCharArray();

    int startIndex = 0;
    int endIndex = result.length - 1;
    char temp;

    for (; endIndex > startIndex; startIndex++,endIndex--) {
      temp = result[startIndex];
      result[startIndex] = result[endIndex];
      result[endIndex] = temp;
    }

    return new String(result);
  }

}

上面的演算法需要5個迴圈(長度/ 2)來使字串倒序“ Hello World”。

------------------------------------
H e l l o W o r l d
------------------------------------
0 1 2 3 4 5 6 7 8 9 10
------------------------------------

Loop #1 - Swap index 0 <-> index 10
------------------------------------
{d} e l l o W o r l {H}
------------------------------------
{0} 1 2 3 4 5 6 7 8 9 {10}
------------------------------------

Loop #2 - Swap index 1 <-> index 9
------------------------------------
d {l} l l o W o r {e} H
------------------------------------
0 {1} 2 3 4 5 6 7 8 {9} 10
------------------------------------

Loop #3 - Swap index 2 <-> index 8
------------------------------------
d l {r} l o W o {l} e H
------------------------------------
0 1 {2} 3 4 5 6 7 {8} 9 10
------------------------------------

Loop #4 - Swap index 3 <-> index 7
------------------------------------
d l r {o} o W {l} l e H
------------------------------------
0 1 2 {3} 4 5 6 {7} 8 9 10
------------------------------------

Loop #5 - Swap index 4 <-> index 6
------------------------------------
d l r o {W} {o} l l e H
------------------------------------
0 1 2 3 {4} 5 {6} 7 8 9 10
------------------------------------

3. Byte[] – StringBuilder(str).reverse(str)

以下程式碼段類似於StringBuilder(str).reverse()的內部實現(UTF16內容除外)。

import java.nio.charset.StandardCharsets;

public class ReverseString3 {

  public static void main(String[] args) {

    String str = "Hello World";
    System.out.println(reverse(str));

  }

  public static String reverse(String input) {

    if (input == null || input.length() < 0)
      throw new IllegalArgumentException("Please provide an input!");

    byte[] val = input.getBytes(StandardCharsets.UTF_8);
    int length = val.length - 1;

    for (int start = (length - 1) >> 1; start >= 0; start--) {
      int end = length - start;
      byte temp = val[start];
      val[start] = val[end];
      val[end] = temp;

      // debugging
      //System.out.println(String.format("start=%s,end=%s",start,end));
    }

    return new String(val);
  }

}

最令人困惑的部分是右移運算子(length - 1) >> 1,這是什麼意思?檢視下面的8位示例,您可以找到規律嗎?

System.out.println(10>>1); // 10 -> 5
0000 1010 = 10
0000 0101|0 = 10 >> 1 = 5

System.out.println(4>>1); // 4 -> 2
0000 0100 = 4
0000 0010|0 = 4 >> 1 = 2

System.out.println(100>>1); // 100 -> 50
0110 0100 = 100
00110 010|0 = 100 >> 1 = 50

System.out.println(7>>1); // 7 -> 3
0000 0111 = 7
0000 0011|1 = 7 >> 1 = 3

對於數字,每右移1位,金額將減少該值的一半並四捨五入。這(length - 1) >> 1試圖找出字串的中間點。

number >> 1 = round_down(number/2) or Math.flooa(number/2)

值交換從內部開始,然後擴充套件到外部。

for (int start = (length - 1) >> 1; start >= 0; start--) {
  int end = length - start;
  byte temp = val[start];
  val[start] = val[end];
  val[end] = temp;
}

上面的演算法圖示如下:

------------------------------------
H e l l o W o r l d
------------------------------------
0 1 2 3 4 5 6 7 8 9 10
------------------------------------

Loop #1 - Swap index 4 <-> index 6
------------------------------------
H e l l {W} {o} o r l d
------------------------------------
0 1 2 3 {4} 5 {6} 7 8 9 10
------------------------------------

Loop #2 - Swap index 3 <-> index 7
------------------------------------
H e l {o} W o {l} r l d
------------------------------------
0 1 2 {3} 4 5 6 {7} 8 9 10
------------------------------------

Loop #3 - Swap index 2 <-> index 8
------------------------------------
H e {r} o W o l {l} l d
------------------------------------
0 1 {2} 3 4 5 6 7 {8} 9 10
------------------------------------

Loop #4 - Swap index 1 <-> index 9
------------------------------------
H {l} r o W o l l {e} d
------------------------------------
0 {1} 2 3 4 5 6 7 8 {9} 10
------------------------------------

Loop #5 - Swap index 0 <-> index 10
------------------------------------
{d} l r o W o l l e {H}
------------------------------------
{0} 1 2 3 4 5 6 7 8 9 {10}
------------------------------------

4. Apache commons-lang3

對於Apache commons-lang3庫,我們可以使用StringUtils.reverse反轉字串和StringUtils.reverseDelimited反轉單詞。

pom.xml

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-lang3</artifactId>
  <version>3.10</version>
</dependency>
import org.apache.commons.lang3.StringUtils;

public class ReverseString3 {

  public static void main(String[] args) {

    System.out.println(StringUtils.reverse("Hello World Java"));        // reverse string

    System.out.println(StringUtils.reverseDelimited("Hello World Java",' ')); // reverse words

  }
}

輸出結果

avaJ dlroW olleH

Java World Hello

檢視其原始碼,Apache-commons-lang3其實是使用new StringBuilder(str).reverse()來反轉字串。

package org.apache.commons.lang3;

 public class StringUtils {

 public static String reverse(final String str) {
   if (str == null) {
     return null;
   }
   return new StringBuilder(str).reverse().toString();
 }

 //...
}

歡迎關注我的部落格,裡面有很多精品合集本文轉載註明出處(必須帶連線,不能只轉文字):字母哥部落格。

覺得對您有幫助的話,幫我點贊、分享!您的支援是我不竭的創作動力! 。另外,筆者最近一段時間輸出瞭如下的精品內容,期待您的關注。

《手摸手教你學Spring Boot2.0》

《Spring Security-JWT-OAuth2一本通》

《實戰前後端分離RBAC許可權管理系統》

《實戰SpringCloud微服務從青銅到王者》

《VUE深入淺出系列》

到此這篇關於使用位運算、值交換等方式反轉java字串-共四種方法的文章就介紹到這了,更多相關使用位運算、值交換等方式反轉java字串-共四種方法內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!