java 字符串 移位_使用位运算、值交换等方式反转java字符串-共四种方法

862a81f7cf90b5dc4271210491be9ffd.png

在本文中,我们将向您展示几种在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

org.apache.commons

commons-lang3

3.10

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

}

//...

}

欢迎关注我的博客,里面有很多精品合集

本文转载注明出处(必须带连接,不能只转文字):字母哥博客。

觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

xstream xml模板_XStream – XStreamely使用Java中的XML数据的简便方法

xstream xml模板有时候&#xff0c;我们不得不处理XML数据。 而且大多数时候&#xff0c;这不是我们一生中最快乐的一天。 甚至有一个术语“ XML地狱”描述了程序员必须处理许多难以理解的XML配置文件时的情况。 但是&#xff0c;不管喜欢与否&#xff0c;有时我们别无选择&…

python知识点智能问答_基于知识图谱的智能问答机器人

研究背景及意义 智能问答是计算机与人类以自然语言的形式进行交流的一种方式&#xff0c;是人工智能研究的一个分支。 知识图谱本质上是一种语义网络&#xff0c;其结点代表实体&#xff08;entity&#xff09;或者概念&#xff08;concept&#xff09;&#xff0c;边代表实体/…

java会了还学什么_java都学哪些内容?学完之后可以做哪些工作?

展开全部阶段一&#xff1a;揭开企业开发神秘面纱 (4周32313133353236313431303231363533e78988e69d8331333431336163)1) Web开发基础&#xff1a;HTML语言、JavaScript、CSS、DOM等2) Oracle数据库基础&#xff1a;安装、配置Oracle数据库&#xff0c;熟练掌握SQL语句3) 操作系…

Java中的RAII

资源获取即初始化&#xff08; RAII &#xff09;是Bjarne Stroustrup用C 引入的一种用于异常安全资源管理的设计思想。 感谢垃圾回收&#xff0c;Java 没有此功能&#xff0c;但是我们可以使用try-with-resources实现类似的功能。 约翰哈德斯&#xff08;John Huddles&#x…

java去掉字符串中前后空格函数_Java去除字符串中的空格

1. String.trim()trim()是去掉首尾空格2.str.replace(" ", ""); 去掉所有空格&#xff0c;包括首尾、中间String str " hell o ";String str2 str.replaceAll(" ", "");System.out.println(str2);3.或者replaceAll("…

python3开发工具推荐_python开发工具有哪些?我推荐这5款python开发工具!

python开发工具有很多&#xff0c;目前我们用的比较多的是pycharm&#xff0c;除了pycharm还有文本编辑器像微软的vscode&#xff0c;sublime text都有非常好的插件&#xff0c;今天&#xff0c;我就把Python程序员使用频率比较高的5款开发工具推荐给大家&#xff0c;希望对大家…

java显示数据库 控件_WebLogic运用DB的Java控件访问数据库(1)

一、方法WebLogic页面与数据通信时&#xff0c;一般采用Java控件直接访问数据连接池&#xff0c;数据的直接操作都定义在Java控件中&#xff0c;页面流做为数据的逻辑处理单元&#xff0c;普通页面做为显示层。可以看出WebLogic这个方法是典型的三层结构&#xff0c;数据层(Jav…

python的实验报告怎么写_学号:20191221,《python实验设计》实验报告三

学号 2019-2020-2 《Python程序设计》实验三讲述课程&#xff1a;《Python程序设计》班级&#xff1a; 1912姓名&#xff1a; 何应霆学号&#xff1a;20191221实验西席&#xff1a;王志强实验日期&#xff1a;2020年5月16日必修/选修&#xff1a; 公选课1.实验内容建立服务端和…

eclipse juno_Eclipse Juno上带有GlassFish的JavaEE 7

eclipse junoJava EE 7很热。 前四个JSR最近通过了最终批准选票&#xff0c;与此同时GlassFish 4达到了升级版83。 如果您关注我的博客&#xff0c;那么您将了解NetBeans的大部分工作。 但是我确实认识到&#xff0c;那里还有其他IDE用户&#xff0c;他们也有权试用最新和最出色…

java 生成校验验证码_java 验证码生成与校验

java绘图相关类验证码工具类package dt2008.util;import javax.imageio.ImageIO;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.awt.*;import java.awt.image.BufferedImage;import java.io.IOException;import ja…

红黑树中nil结点_什么是红黑树?程序员面试必问!

点击上方java小组&#xff0c;选择“置顶公众号”优质文章&#xff0c;第一时间送达当在10亿数据中只需要进行10几次比较就能查找到目标时&#xff0c;不禁感叹编程之魅力&#xff01;人类之伟大呀&#xff01; —— 学红黑树有感。终于&#xff0c;在学习了几天的红黑树相关的…

杰克逊JSON解析错误-UnrecognizedPropertyException:无法识别的字段,未标记为可忽略[已解决]...

在解析从我们的一个RESTful Web服务接收到的JSON字符串时&#xff0c;我收到此错误“线程“ main”中的异常com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException&#xff1a;无法识别的字段“人”&#xff08;类Hello $ Person&#xff09;&#xff0c;不是标记…

mysql2008数据库配置_SQL Server 2008 R2 超详细安装图文教程

这篇文章主要介绍了SQL Server 2008 R2 超详细安装图文教程,需要的朋友可以参考下一、下载SQL Server 2008 R2安装文件二、将安装文件刻录成光盘或者用虚拟光驱加载&#xff0c;或者直接解压&#xff0c;打开安装文件&#xff0c;出现下面的界面安装SQL Server 2008 R2需要.NET…

hdfs读写流程_深度探索Hadoop分布式文件系统(HDFS)数据读取流程

一、开篇Hadoop分布式文件系统(HDFS)是Hadoop大数据生态最底层的数据存储设施。因其具备了海量数据分布式存储能力&#xff0c;针对不同批处理业务的大吞吐数据计算承载力&#xff0c;使其综合复杂度要远远高于其他数据存储系统。因此对Hadoop分布式文件系统(HDFS)的深入研究&a…

python可视化分析网易云音乐评论_Python数据可视化:网易云音乐歌单

网易云音乐2018年度听歌报告—遇见你&#xff0c;真好。相信有不少人在上周&#xff0c;应该已经看过自己网易云音乐的年度报告了。小F也是去凑凑热闹&#xff0c;瞅了一波自己的年度听歌报告。那么你在云村又听了多少首歌&#xff0c;听到最多的歌词又是什么呢?2018年你的年度…

mysql隔离级别验证_MySQL事务隔离级别以及验证

查询初始数据开启A事务  并做更新操作再另一端 B开始另一个事务查询 事务级别设置为读未提查询到事务未提交的数据 a的count修改为3 但是没有提交2 第二个级别 读已提交 避免脏读问题 但是有不可重复读问题回滚数据 修改隔离级别 确保都是 读已提交级别客户端A客户端B验证 脏…

登录样式:log4j 2,上下文,自动清除…全部不附加任何字符串!

日志记录-保持操作的时间跟踪-对于任何关键任务系统&#xff0c;无论大小&#xff0c;都至关重要。 我们的Project-X框架也是如此 &#xff0c;这就是为什么我们希望从一开始就正确地做到这一点。 基于我们在传奇的UltraESB上的登录经验&#xff0c; 上下文日志记录&#xff0…

python37安装失败_Linux 安装Python37

1、下载python3.7.0https://www.python.org/downloads/release/python-370/2、创建Linux的python37目录mkdir /usr/local/python373、解压python3.7.0源码tar zxvf python3.7.0.tar.zg4、配置编译参数./configure --prefix/usr/local/python375、make6、make install注意&#…

python string模块template_Python标准库笔记(1) — string模块

String模块包含大量实用常量和类&#xff0c;以及一些过时的遗留功能&#xff0c;并还可用作字符串操作。1. 常用方法常用方法描述str.capitalize()把字符串的首字母大写str.center(width)将原字符串用空格填充成一个长度为width的字符串&#xff0c;原字符串内容居中str.count…

注意力机制可视化_目标跟踪中的(STAM)时空注意力机制

目标跟踪分为单目标跟踪和多目标跟踪&#xff0c;单目标跟踪较为简单&#xff0c;这里我们只讨论多目标跟踪。多目标跟踪的遮挡问题多目标跟踪时特别容易发生目标间的相互遮挡&#xff0c;从而导致严重的预测偏移问题&#xff0c;如下图所示&#xff1a;红色框的行人在和蓝色框…