欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用位運算、值交換等方式反轉(zhuǎn)java字符串的多種方法(四種方法)

 更新時間:2020年07月14日 08:36:48   作者:字母哥博客  
這篇文章主要介紹了使用位運算、值交換等方式反轉(zhuǎn)java字符串,本文通過四種方式給大家講解,給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

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

  • StringBuilder(str).reverse()
  • char[]循環(huán)與值交換
  • byte循環(huán)與值交換apache-commons-lang3

如果是為了進(jìn)行開發(fā),請選擇StringBuilder(str).reverse()API。出于學(xué)習(xí)的目的,我們可以研究char[]byte方法,其中涉及到值互換和移位運算技術(shù),這些技術(shù)對于了解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());

 }
}

輸出結(jié)果

avaJ ni gnirtS a esreveR

2.char[]

首先,我們將字符串轉(zhuǎn)換為char數(shù)組,并逐個循環(huán)char數(shù)組,并使用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個循環(huán)(長度/ 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
------------------------------------
vvxyksv9kd  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()的內(nèi)部實現(xiàn)(UTF16內(nèi)容除外)。

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位示例,您可以找到規(guī)律嗎?

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

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

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

值交換從內(nèi)部開始,然后擴展到外部。

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
------------------------------------
vvxyksv9kd  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反轉(zhuǎn)字符串和StringUtils.reverseDelimited反轉(zhuǎn)單詞。

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

 }
}

輸出結(jié)果

avaJ dlroW olleH

Java World Hello

查看其源代碼,Apache-commons-lang3其實是使用new StringBuilder(str).reverse()來反轉(zhuǎn)字符串。

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();
 }

 //...
}

歡迎關(guān)注我的博客,里面有很多精品合集本文轉(zhuǎn)載注明出處(必須帶連接,不能只轉(zhuǎn)文字):字母哥博客。

覺得對您有幫助的話,幫我點贊、分享!您的支持是我不竭的創(chuàng)作動力! 。另外,筆者最近一段時間輸出了如下的精品內(nèi)容,期待您的關(guān)注。

《手摸手教你學(xué)Spring Boot2.0》

《Spring Security-JWT-OAuth2一本通》

《實戰(zhàn)前后端分離RBAC權(quán)限管理系統(tǒng)》

《實戰(zhàn)SpringCloud微服務(wù)從青銅到王者》

《VUE深入淺出系列》

到此這篇關(guān)于使用位運算、值交換等方式反轉(zhuǎn)java字符串-共四種方法的文章就介紹到這了,更多相關(guān)使用位運算、值交換等方式反轉(zhuǎn)java字符串-共四種方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java簡單實現(xiàn)UDP和TCP的示例

    Java簡單實現(xiàn)UDP和TCP的示例

    下面小編就為大家?guī)硪黄狫ava簡單實現(xiàn)UDP和TCP的示例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • 淺談spring boot使用thymeleaf版本的問題

    淺談spring boot使用thymeleaf版本的問題

    這篇文章主要介紹了spring boot使用thymeleaf版本的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • spring data jpa @Query注解中delete語句報錯的解決

    spring data jpa @Query注解中delete語句報錯的解決

    這篇文章主要介紹了spring data jpa @Query注解中delete語句報錯的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 淺談十個常見的Java異常出現(xiàn)原因

    淺談十個常見的Java異常出現(xiàn)原因

    這篇文章主要介紹了十個常見的Java異常出現(xiàn)原因,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • gRPC中interceptor攔截器的使用教程

    gRPC中interceptor攔截器的使用教程

    gRPC中的interceptor攔截器分為客戶端攔截器和服務(wù)端攔截器,分別是在客戶端和服務(wù)端的請求被發(fā)送出去之前進(jìn)行處理的邏輯,下面就跟隨小編一起學(xué)習(xí)一下interceptor攔截器的具體使用吧
    2023-08-08
  • Java線程池中多余的線程是如何回收的

    Java線程池中多余的線程是如何回收的

    對于經(jīng)常使用第三方框架進(jìn)行web開發(fā)的程序員來說,Java線程池理所應(yīng)當(dāng)是非常智能的,那么Java線程池中多余的線程是如何回收的?本文就來介紹一下
    2021-05-05
  • 使用Java快速將Web中表格轉(zhuǎn)換成Excel的方法

    使用Java快速將Web中表格轉(zhuǎn)換成Excel的方法

    在平時做系統(tǒng)項目時,經(jīng)常會需要做導(dǎo)出功能,下面這篇文章主要給大家介紹了關(guān)于使用Java快速將Web中表格轉(zhuǎn)換成Excel的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • Mybatis持久層框架入門之CRUD實例代碼詳解

    Mybatis持久層框架入門之CRUD實例代碼詳解

    這篇文章主要介紹了Mybatis持久層框架入門之CRUD實例,需要的朋友可以參考下
    2022-05-05
  • 關(guān)于JSON解析中獲取不存在的key問題

    關(guān)于JSON解析中獲取不存在的key問題

    這篇文章主要介紹了關(guān)于JSON解析中獲取不存在的key問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 每天學(xué)Java!一分鐘了解JRE與JDK

    每天學(xué)Java!一分鐘了解JRE與JDK

    每天學(xué)Java!一分鐘了解JRE與JDK,什么是JRE?什么是JDK?什么是JVM?相信通過本文大家都會有所了解,感興趣的小伙伴們可以參考一下
    2016-07-07

最新評論