在本文中,咱们将向您展现几种在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 -> 50000 1010 = 100000 0101|0 = 10 >> 1 = 5System.out.println(4>>1); // 4 -> 20000 0100 = 40000 0010|0 = 4 >> 1 = 2System.out.println(100>>1); // 100 -> 500110 0100 = 10000110 010|0 = 100 >> 1 = 50System.out.println(7>>1); // 7 -> 30000 0111 = 70000 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 olleHJava 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深入浅出系列》