How do I output a word in reverse? Turn "Hello java hello China" into "China hello java hello"?
It seems very simple, just want to divide the string into words first, then add a StringBuilder or StringBuffer, and finally use the ToString method, now to achieve:
/** * @authorFrank * @create 2017/11/24 * @description*/ Public classTest { Public Static voidMain (string[] args) {String src= "Hello Java hello China";//strings that need to be processedstring[] arr = Src.split ("");//Split by Space intlength = Arr.length;//calculating the length of an arrayStringBuilder SB =NewStringBuilder (Src.length ());//Create a new StringBuilder object for(inti=length-1;i>=1;i--) {sb.append (Arr[i]+" ");//add string to StringBuilder in sequence} sb.append (arr[0]);//The last Word does not add a spaceSystem.out.println (Sb.tostring ());//Output }}
Because it is a single thread, the efficiency of using StringBuilder is higher than stringbuffer, and the output is as follows:
China Hello Java Hello
Well, it's a perfect solution to the problem right now.
But in fact, it is not always separated by a space, but there are commas, periods, quotes and so on, then how to deal with it?
That can only be a character one character to judge, with Charat () to determine whether the character is a comma period or quotation marks, spaces, if you know the separation point, if not, add a temporary StringBuilder object, the code is as follows:
/** * @authorFrank * @create 2017/11/24 * @description*/ Public classTest2 { Public Static voidMain (string[] args) {String src= "Hello Java,hello China";//strings that need to be processedStringBuilder tmp =NewStringBuilder (20);//define a StringBuilder objectStringBuilder Goal =NewStringBuilder (Src.length ());//define a StringBuilder object to hold the information that is ultimately to be output CharC//define a character variable for(intI=src.length () -1;i>=0;i--) {C= Src.charat (i);//To take a character from a backward forward if(c = = ' | | c = = ', ' | | c = = '. ') {//determine if the character is delimitedGoal.append (TMP);//if it is, add TMP to the goal.Goal.append (c);//Adding the separator word Fuye togetherTmp.delete (0,tmp.length ());//empty tmp}Else{Tmp.insert (0,C);//if it is not a delimited character, the word is incomplete and continues to be added to TMP } } if(!tmp.equals ("") {goal.append (TMP);//If there is content in TMP, it is added to the goal} System.out.println (Goal.tostring ());//Output }}
The output is as follows:
. China Hello,java Hello
It seems that there is no problem.
Now the difficulty is further upgraded, if there is a 20M string, "Hello_,_china_..._bye." (... Represents the middle omitted part), the word separates with the space, now needs to put all the words all reverse order, the request efficiency cannot be too low. Do not look at this 20M, it seems that there is no difficulty, the key lies in this 20M, certainly not like the first way to split with split, that will create a large array of strings, wasting a lot of space.
So here's the second way.
We first randomly generate a string, and then we use the second way to handle it:
/** * @authorFrank * @create 2017/11/24 * @description*/ Public classTest3 { Public Static voidMain (string[] args) {LongTime = 0; StringBuilder SB=NewStringBuilder (); //mister into a relatively large string for(inti=0;i<10000000;i++) {sb.append (i+" "); } System.out.println ("String Length:" +sb.length ()); //Start calculation timeTime =System.currenttimemillis (); StringBuilder tmp=NewStringBuilder (20);//define a StringBuilder object to hold temporary dataStringBuilder Goal =NewStringBuilder (Sb.length ());//define a StringBuilder object to hold the information that is ultimately to be output CharC//define a character variable for(intI=sb.length () -1;i>=0;i--) {C= Sb.charat (i);//To take a character from a backward forward if(c = = ") {//determine if the character is delimitedGoal.append (TMP);//if it is, add TMP to the goal.Goal.append (c);//Adding the separator word Fuye togetherTmp.delete (0,tmp.length ());//empty tmp}Else{Tmp.insert (0,C);//if it is not a delimited character, the word is incomplete and continues to be added to TMP } } if(!tmp.equals ("") {goal.append (TMP);//If there is content in TMP, it is added to the goal} System.out.println (System.currenttimemillis ()-time);//Output Run time }}
The output is as follows:
String length: 78888890608
608 milliseconds, the speed is OK, to generate a string or to spend a lot of time, because the memory has been copied, if the number of cycles after the addition of a 0, will be out of memory ....
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)
At this point, the discussion of this issue is complete, if there is a better and faster way, welcome message exchange discussion.
"Java" word reverse output