Java實(shí)現(xiàn)單詞倒序輸出
如何將一段單詞倒序輸出?把“Hello Java Hello China”變成“China Hello Java Hello”?
看起來好像很簡單,只需要把字符串先分割成單詞,然后加入一個(gè)StringBuilder或者StringBuffer中,最后再使用toString方法即可,現(xiàn)在來實(shí)現(xiàn)一下:
/**
* @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;//計(jì)算數(shù)組長度
StringBuilder sb = new StringBuilder(src.length());//新建一個(gè)StringBuilder對(duì)象
for (int i=length-1;i>=1;i--){
sb.append(arr[i]+" ");//將字符串依次加入StringBuilder中
}
sb.append(arr[0]);//最后一個(gè)單詞不加空格
System.out.println(sb.toString());//輸出
}
}
China Hello Java Hello
好的,現(xiàn)在就完美的解決了問題。
但事實(shí)上,通常并不是全用空格分隔開來的,而是有逗號(hào),句號(hào),引號(hào)等,那么這該如何處理呢?
那就只能一個(gè)字符一個(gè)字符判斷了,用charAt()來判斷字符是否為逗號(hào)句號(hào)或者引號(hào),空格,如果是的話就知道到了分隔點(diǎn)了,如果不是的話就加入一個(gè)臨時(shí)的StringBuilder對(duì)象,代碼如下:
/**
* @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);//定義一個(gè)StringBuilder對(duì)象
StringBuilder goal = new StringBuilder(src.length());//定義一個(gè)StringBuilder對(duì)象來存放最終要輸出的信息
char c;//定義一個(gè)字符變量
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);//如果不是分隔字符,說明單詞未完整,繼續(xù)加入tmp中
}
}
if (!tmp.equals("")){
goal.append(tmp);//如果tmp中還有內(nèi)容,在添加到goal中
}
System.out.println(goal.toString());//輸出
}
}
輸出如下:
.China Hello,Java Hello
好像沒什么問題了?! ?/p>
現(xiàn)在難度進(jìn)一步升級(jí),如果有一個(gè)20M的字符串,“Hello_,_China_..._Bye.”(...代表中間省略的部分),單詞之間用空格隔開,現(xiàn)在需要把所有單詞全部顛倒順序,要求效率不能太低。不看這個(gè)20M的話,好像沒什么難度,關(guān)鍵就在于這個(gè)20M,肯定不能像第一種方式用split分割,那樣的話會(huì)創(chuàng)建一個(gè)很大的字符串?dāng)?shù)組,浪費(fèi)很多空間。
所以這里采用第二種方式。
我們先隨機(jī)生成一個(gè)字符串,然后再使用第二種方式進(jìn)行處理:
/**
* @author Frank
* @create 2017/11/24
* @description
*/
public class Test3 {
public static void main(String[] args) {
long time = 0;
StringBuilder sb = new StringBuilder();
//先生成一個(gè)比較大的字符串
for (int i=0;i<10000000;i++){
sb.append(i+" ");
}
System.out.println("字符串長度:"+sb.length());
//開始計(jì)算時(shí)間
time = System.currentTimeMillis();
StringBuilder tmp = new StringBuilder(20);//定義一個(gè)StringBuilder對(duì)象存放臨時(shí)數(shù)據(jù)
StringBuilder goal = new StringBuilder(sb.length());//定義一個(gè)StringBuilder對(duì)象來存放最終要輸出的信息
char c;//定義一個(gè)字符變量
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);//如果不是分隔字符,說明單詞未完整,繼續(xù)加入tmp中
}
}
if (!tmp.equals("")){
goal.append(tmp);//如果tmp中還有內(nèi)容,在添加到goal中
}
System.out.println(System.currentTimeMillis()-time);//輸出運(yùn)行時(shí)間
}
}
輸出如下:
字符串長度:78888890
608
608毫秒,速度還ok,生成字符串還是要花挺多時(shí)間的,因?yàn)橐恢币M(jìn)行內(nèi)存復(fù)制,如果在循環(huán)次數(shù)后再加一個(gè)0,就會(huì)內(nèi)存不足了。。。。
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)
至此,本篇問題討論完畢,如果有更好更快的方法,歡迎留言交流討論。
相關(guān)文章
Springboot啟動(dòng)停止命令的.sh腳本編寫方式
這篇文章主要介紹了Springboot啟動(dòng)停止命令的.sh腳本編寫方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
SpringBoot多線程進(jìn)行異步請(qǐng)求的處理方式
這篇文章主要介紹了SpringBoot多線程進(jìn)行異步請(qǐng)求的處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜2021-12-12
SpringBoot整合Mybatis實(shí)現(xiàn)CRUD
這篇文章主要介紹了SpringBoot整合Mybatis實(shí)現(xiàn)CRUD的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
Java實(shí)現(xiàn)樹形結(jié)構(gòu)的示例代碼
由于業(yè)務(wù)需要,后端需要返回一個(gè)樹型結(jié)構(gòu)給前端,包含父子節(jié)點(diǎn)的數(shù)據(jù)已經(jīng)在數(shù)據(jù)庫中存儲(chǔ)好。本文將為大家分享Java現(xiàn)樹形結(jié)構(gòu)的示例代碼,需要的可以參考下2022-05-05

