Java实现单词倒序输出

  如何将一段单词倒序输出?把“Hello Java Hello China”变成“China Hello Java Hello”?

  看起来好像很简单,只需要把字符串先分割成单词,然后加入一个StringBuilder或者StringBuffer中,最后再使用toString方法即可,现在来实现一下:

/**
 * @author Frank
 * @create 2017/11/24
 * @description
 */
public class Test {
  public static void main(String[] args) {
    String src = "Hello Java Hello China";//需要处理的字符串
    String[] arr = src.split(" ");//按空格分割
    int length = arr.length;//计算数组长度
    StringBuilder sb = new StringBuilder(src.length());//新建一个StringBuilder对象
    for (int i=length-1;i>=1;i--){
        sb.append(arr[i]+" ");//将字符串依次加入StringBuilder中
    }
    sb.append(arr[0]);//最后一个单词不加空格
    System.out.println(sb.toString());//输出
  }
}

China Hello Java Hello

  好的,现在就完美的解决了问题。

  但事实上,通常并不是全用空格分隔开来的,而是有逗号,句号,引号等,那么这该如何处理呢?

  那就只能一个字符一个字符判断了,用charAt()来判断字符是否为逗号句号或者引号,空格,如果是的话就知道到了分隔点了,如果不是的话就加入一个临时的StringBuilder对象,代码如下:

/**
 * @author Frank
 * @create 2017/11/24
 * @description
 */
public class Test2 {
  public static void main(String[] args) {
    String src = "Hello Java,Hello China.";//需要处理的字符串
    StringBuilder tmp = new StringBuilder(20);//定义一个StringBuilder对象
    StringBuilder goal = new StringBuilder(src.length());//定义一个StringBuilder对象来存放最终要输出的信息
    char c;//定义一个字符变量
    for (int i=src.length()-1;i>=0;i--){
      c = src.charAt(i);//从后往前取字符
      if(c ==' ' || c == ',' || c == '.'){//判断是否为分隔字符
        goal.append(tmp);//如果是的话就把tmp加入到goal中来
        goal.append(c);//在把分隔字符也一起加入
        tmp.delete(0,tmp.length());//清空tmp
      }else {
        tmp.insert(0,c);//如果不是分隔字符,说明单词未完整,继续加入tmp中
      }
    }
    if (!tmp.equals("")){
      goal.append(tmp);//如果tmp中还有内容,在添加到goal中
    }
    System.out.println(goal.toString());//输出
  }
}

  输出如下:

.China Hello,Java Hello

  好像没什么问题了。  

  现在难度进一步升级,如果有一个20M的字符串,“Hello_,_China_..._Bye.”(...代表中间省略的部分),单词之间用空格隔开,现在需要把所有单词全部颠倒顺序,要求效率不能太低。不看这个20M的话,好像没什么难度,关键就在于这个20M,肯定不能像第一种方式用split分割,那样的话会创建一个很大的字符串数组,浪费很多空间。

  所以这里采用第二种方式。

  我们先随机生成一个字符串,然后再使用第二种方式进行处理:

/**
 * @author Frank
 * @create 2017/11/24
 * @description
 */
public class Test3 {
  public static void main(String[] args) {
    long time = 0;
    StringBuilder sb = new StringBuilder();
    //先生成一个比较大的字符串
    for (int i=0;i<10000000;i++){
      sb.append(i+" ");
    }
    System.out.println("字符串长度:"+sb.length());

    //开始计算时间
    time = System.currentTimeMillis();
    StringBuilder tmp = new StringBuilder(20);//定义一个StringBuilder对象存放临时数据
    StringBuilder goal = new StringBuilder(sb.length());//定义一个StringBuilder对象来存放最终要输出的信息
    char c;//定义一个字符变量
    for (int i=sb.length()-1;i>=0;i--){
      c = sb.charAt(i);//从后往前取字符
      if(c ==' '){//判断是否为分隔字符
        goal.append(tmp);//如果是的话就把tmp加入到goal中来
        goal.append(c);//在把分隔字符也一起加入
        tmp.delete(0,tmp.length());//清空tmp
      }else {
        tmp.insert(0,c);//如果不是分隔字符,说明单词未完整,继续加入tmp中
      }
    }
    if (!tmp.equals("")){
      goal.append(tmp);//如果tmp中还有内容,在添加到goal中
    }
    System.out.println(System.currentTimeMillis()-time);//输出运行时间
  }
}

  输出如下:

字符串长度:78888890
608

  608毫秒,速度还ok,生成字符串还是要花挺多时间的,因为一直要进行内存复制,如果在循环次数后再加一个0,就会内存不足了。。。。

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3332)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
at java.lang.StringBuilder.append(StringBuilder.java:136)
at com.frank.string.test1.Test3.main(Test3.java:14)

  至此,本篇问题讨论完毕,如果有更好更快的方法,欢迎留言交流讨论。

(0)

相关推荐

  • java实现倒序读取文件功能示例分享

    Long end,long num,File file,String charset4个参数说明end 相当于坐标 ,tail 向上的起点,num是读取的行数,file 目标文件 charset字符集 默认UTF8end 为 null 代表从 文件 最末端 向上 获取. Map m=FileUtil.tail(null,10,file,null)//读取文件最后10行,结果在 m.get(FileUtil.ARR) 里FileUtil.tail(m.get(FileUtil.POINT),3,f

  • Java 数组元素倒序的三种方式(小结)

    将数组元素反转有多种实现方式,这里介绍常见的三种. 直接数组元素对换 @Test public void testReverseSelf() throws Exception { System.out.println("use ReverseSelf"); String[] strings = { "ramer", "jelly", "bean", "cake" }; System.out.println(

  • 利用java实现单词倒序排列

    本文就是会将数组里面的单词进行倒序排列 例如 how old are you -> you are old how 示例程序输出结果: the first: How old are you !? I don't understand the second: understand don't I ?! you are old How 示例代码 public static void main(String[] args) { char[] chars= new String("How old

  • Java实现字符串倒序输出的常用方法小结

    本文实例汇总了Java实现字符串倒序输出的常用方法,分享给大家供大家参考.具体方法如下: 1. 最容易想到的估计就是利用String类的toCharArray(),再倒序输出数组的方法了. 实现代码如下: import javax.swing.JOptionPane; public class ReverseString { public static void main (String args[]){ String originalString; String resultString =

  • Java实现单词倒序输出

    如何将一段单词倒序输出?把"Hello Java Hello China"变成"China Hello Java Hello"? 看起来好像很简单,只需要把字符串先分割成单词,然后加入一个StringBuilder或者StringBuffer中,最后再使用toString方法即可,现在来实现一下: /** * @author Frank * @create 2017/11/24 * @description */ public class Test { public

  • C#中倒序输出字符串的方法示例

    前言 本文将演示如何将字符串的单词倒序输出.注意:在这里我不是要将"John" 这样的字符串倒序为成"nhoJ".这是不一样的,因为它完全倒序了整个字符串.而以下代码将教你如何将"你 好 我是 缇娜"倒序输出为"缇娜 是 我 好 你".所以,字符串的最后一个词成了第一个词,而第一个词成了最后一个词.当然你也可以说,以下代码是从最后一个到第一个段落字符串的读取. 对此我使用了两种方法. 第一种方法仅仅采用拆分功能. 根据空格拆分

  • Python给定一个句子倒序输出单词以及字母的方法

    如下所示: #!/usr/bin/python # -*- coding: utf-8 -*- def rever(sentence): newwords = [] words = sentence.split() words.reverse() space = ' '#单词之间一个间隔 for word in words: newword = [] new = ''#单词的字母间无间隔 l = len(word) for i in range(l): newword.append(word[l

  • java实现单词查询小程序

    本文实例为大家分享了Java单词查询小程序,供大家参考,具体内容如下 1.任务简介 本次分享的单词查询小程序是基于MySQL数据库制作的,使用的词汇表是我在博客<将Excel文件导入MySQL数据库的方法>中讲解的,首先我需要讲解Java连接MySQL数据库的方法,然后再给大家分享单词查询小程序. 2.Java连接MySQL数据库的方法 1)要使用Java程序对MySQL数据库进行操作,首先需要建立它们之间的连接,关于连接驱动可以通过百度下载,下载解压后可以得到一个jar包,将该包导入预先创建

  • mysql记录根据日期字段倒序输出

    我们知道倒序输出是很简单的 select * from table order by id desc 直接这样就可以 那么现在的问题在于日期字段怎么来倒序输出 这里我们用到cast()来将指定的字段转换为我们需要的类型 如下是实际项目中的sql语句 select * from water where phoneNumber=@phoneNumber order by cast(date as datetime) desc 我们说学而不思则罔,我们来思考下深层次的内容. 经过查阅资料得知类型的转换

  • js for循环倒序输出数组元素的实例

    实例如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>倒序输出数组元素</title> </head> <body> <script type="text/javascript"> var a=[1,2,3,4] for(var i=a.length-1;i>=0;i--){

  • java实现单词搜索迷宫游戏

    本文实例讲述了java实现单词搜索迷宫游戏.分享给大家供大家参考.具体分析如下: 我们在杂志上,经常能够看到找单词的小游戏,在一个二维表格中,存在各种字母,我们可以从八个方向找单词.这个用计算机处理十分方便,但是,算法的好坏很重要,因为要是用蛮力算法实现,那么耗费的时间是不可想象的. 这是数据结构与问题求解Java语言描述一书中给的实现思路 完整代码如下,注释写的很明白了 import java.io.BufferedReader; import java.io.FileReader; impo

  • java 实现随机数组输出及求和实例详解

    java 实现随机数组输出及求和 问题描述: 随机生成10个数,填充一个数组,然后用消息框显示数组内容,接着计算数组元素的和,将结果也显示在消息框中. 设计思路: 使用java.util中的Random类来获取随机数,存入数组后,定义一个String类的对象result,利用for循环存储要输出的数组内容到result并且求和:再利用javax.swing中的JoptionPane类创建消息框进行结果输出. 源代码: import java.util.*; import javax.swing.

随机推荐