字符串倒置

说到这字符串倒置,其实还有些值得说道的,尽管不难。
C/C++有个reverse(),可以直接用,但我大Java并没有……
想到一种办法并不难,但你能想到几种有效的办法呢?
一起来看看吧!

先做一下基本的定义,后面可以统一使用:

String string = "ADFGJINJOOKC";
int length = string.length();
char[] chars0 = string.toCharArray();

Strategy_1:倒转char[]

倒转char[]其实就是新生成一个char[],正向遍历原char[],把char数据逆向复制到新char[]中。

char[] chars1 = new char[length];
for (int i = 0; i < length; i++) {chars1[i] = chars0[length-i-1];
}
System.out.println(new String(chars1));

Strategy_2:利用StringBuilder的reverse()

虽然String没有reverse(),但可以利用String对象生成StringBuilder对象,再reverse(),打印就直接调toString()了,方便简洁。

System.out.println(new StringBuilder(string).reverse());

Strategy_3:直接拼接

所谓直接拼接,其实就是new一个StringBuilder对象,倒着遍历char[],把char一个一个append()到StringBuilder对象上。

StringBuilder reverse3 = new StringBuilder();
for (int i = length-1; i >= 0; i--) {reverse3.append(chars0[i]);
}
System.out.println(reverse3);

看了解法二,说实话,此法大可不必……

Strategy_4:直接倒着打印

倒着遍历,直接打印。
由于需要大量的IO,所以慢。
也就初学者会真的这么用吧……

for (int i = length-1; i >= 0; i--) {System.out.print(chars0[i]);
}
System.out.println();

Strategy_5:利用charAt(i)来拼接

String确实有charAt(i),但为什么摆着现成的随机访问index不用呢?何必何必,感觉还不如方法三。

StringBuilder reverse5 = new StringBuilder();
for (int i = length-1; i >= 0; i--) {reverse5.append(string.charAt(i));
}
System.out.println(reverse5);

Strategy_6:使用栈来拼接

栈自然是可以的,LIFO,但单独拿出来而不利用数组的随机访问,大可不必。

何况是Java的java.util.Stack,继承自java.util.Vecter的一个类,一个被synchronized包裹的类,不必……

Stack<Character> stack = new Stack<>();
for (char c : chars0) {stack.push(c);
}
StringBuilder reverse6 = new StringBuilder();
while (!stack.isEmpty()) {reverse6.append(stack.pop());
}
System.out.println(reverse6);

Strategy_7:两侧向中间交换

这个思想就是swap(),经典的交换算法。

char[] chars7 = chars0;
for (int i = 0; i < length/2; i++) {char temp = chars7[i];chars7[i] = chars7[length-i-1];chars7[length-i-1] = temp;
}
System.out.println(new String(chars7));

Strategy_7の位运算优化

先写swap():

private static void swap(char a, char b) {if (a != b) {a ^= b;b ^= a;a ^= b;}
}

再写具体的交换:(毕竟引用传递嘛,隐去了指针,不需使用&)

char[] chars8 = chars0;
for (int i = 0; i < length/2; i++) {swap(chars8[i], chars8[length-i-1]);
}
System.out.println(new String(chars8));

完整Java代码

import java.util.Stack;public class StringReverseTest {private static void swap(char a, char b) {if (a != b) {a ^= b;b ^= a;a ^= b;}}public static void main(String[] args) {String string = "ADFGJINJOOKC";int length = string.length();char[] chars0 = string.toCharArray();//方法一:倒转char[]char[] chars1 = new char[length];for (int i = 0; i < length; i++) {chars1[i] = chars0[length-i-1];}System.out.println(new String(chars1));//方法二:利用StringBuilder的reverse()System.out.println(new StringBuilder(string).reverse());//方法三:直接拼接StringBuilder reverse3 = new StringBuilder();for (int i = length-1; i >= 0; i--) {reverse3.append(chars0[i]);}System.out.println(reverse3);//方法四:直接倒着打印for (int i = length-1; i >= 0; i--) {System.out.print(chars0[i]);}System.out.println();//方法五:利用charAt(i)来拼接StringBuilder reverse5 = new StringBuilder();for (int i = length-1; i >= 0; i--) {reverse5.append(string.charAt(i));}System.out.println(reverse5);//方法六:使用栈来拼接Stack<Character> stack = new Stack<>();for (char c : chars0) {stack.push(c);}StringBuilder reverse6 = new StringBuilder();while (!stack.isEmpty()) {reverse6.append(stack.pop());}System.out.println(reverse6);//方法七:两侧向中间交换char[] chars7 = chars0;for (int i = 0; i < length/2; i++) {char temp = chars7[i];chars7[i] = chars7[length-i-1];chars7[length-i-1] = temp;}System.out.println(new String(chars7));//swap()char[] chars8 = chars0;for (int i = 0; i < length/2; i++) {swap(chars8[i], chars8[length-i-1]);}System.out.println(new String(chars8));}}

表表态

个人用着方法二,那个StringBuilder的reverse()比较顺手。

【Java】转置String的各种方法分析相关推荐

  1. Java之String系列--intern方法的作用及原理

    原文网址:Java之String系列--intern方法的作用及原理_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java的String的intern方法的原理. 常量池简介 在 JAVA 语言中 ...

  2. JAVA中String的split方法

    我的个人网站: http://riun.xyz 以下源码版本:JDK1.8 简介 Java 中 String 的 split 方法可以将字符串根据指定的间隔进行切割,例如字符串 str = " ...

  3. java intern_java String的intern方法

    我们知道再jvm的运行时内存可以分为堆.方法区.程序计数器.虚拟机栈和本地方法栈.而在方法区中有一个字符串常量池,用来保存字符串这个不可变量.如果我们使用String str=new String(& ...

  4. Java中String连接性能的分析

    总结:如果String的数量小于4(不含4),使用String.concat()来连接String,否则首先计算最终结果的长度,再用该长度来创建一个StringBuilder,最后使用这个String ...

  5. Java中String类的方法及说明

    String : 字符串类型 一.构造函数      String(byte[ ] bytes):通过byte数组构造字符串对象.      String(char[ ] value):通过char数 ...

  6. 【转载】Java中String类的方法及说明

    转载自:http://www.cnblogs.com/YSO1983/archive/2009/12/07/1618564.html String : 字符串类型 一.构造函数      String ...

  7. java ignorecase_Java String compareToIgnoreCase() 使用方法及示例

    Java String compareToIgnoreCase() 使用方法及示例 Java String compareTo()方法按字典顺序比较两个字符串(按字典顺序),而忽略大小写. 字符串co ...

  8. Java中String中split方法

    Java split()方法 split()方法根据匹配给定的正则表达式来拆分字符串 注意:. .$.|.和*等转义字符必须加\\ 语法 public String[] split(String re ...

  9. Java中String类 compareTo()方法比较字符串详解

    中心:String 是字符串,它的比较用compareTo方法,它从第一位开始比较, 如果遇到不同的字符,则马上返回这两个字符的ascii值差值.返回值是int类型 1.当两个比较的字符串是英文且长度 ...

最新文章

  1. 【实施工程师】Linux查看日志后100行
  2. Ironport对邮件主题中包括特殊字符的过滤
  3. 坚持做一件事情真的很不容易,首先必须要克服惰性!
  4. ubuntu 18 Cannot find installed version of python-django or python3-django.
  5. Replace Delegation with Inheritance(以继承取代委托)
  6. Java 中判断一个字符串是否包含另外一个字符串的方法
  7. 基于LINQ to SQL的WEB开发三层架构(1)
  8. THREEJS - 动态标签(texture纹理方式)
  9. java如何打JAR包
  10. 推荐下载:Windows 7 Ultimate (x86/x64) MSDN简体中文旗舰版
  11. Python开发人员最喜欢的工具
  12. Springboot集成JavaMailSender发送邮件
  13. 心语家园系统维护工具箱v1.0
  14. Android 中自定义软键盘
  15. python3简单爬取妹纸图网站图片
  16. 数据结构-单链表LNode,*LinkList
  17. 12.3 让知识改变命运——《逆袭大学》连载
  18. 乘法鉴相器的matlab仿真,基于COSTAS环的载波恢复技术
  19. 如何批量取消 Word 文档的限制编辑?
  20. Cocos2d-x 3.x游戏开发之旅

热门文章

  1. [NOIP2003]传染病控制题解
  2. 转:20分钟教你使用hexo搭建github博客
  3. zendstudio快捷键收录
  4. MATLAB GUI不同控件函数间变量传递方法
  5. winform 分页控件分享(二)
  6. AJAX ControlToolkit学习日志-Tabs(27)
  7. HBase meta元数据损坏导致hbase master初始化失败
  8. mysql1714_linux环境安装mysql
  9. c++和python有联系吗_Python和C++交互
  10. python调用ping命令_在Python中调用Ping命令,批量IP的方法