将一个英文句子反转, e.g. much. very you love I => I love you very much.
import java.util.Stack;
import java.util.StringTokenizer;
/**
* 将一个英文句子反转, e.g. much. very you love I => I love you very much.
*/
public class WordsReverse {
// spilt StringBuilder
public static String reverse1(String str) {
if (str == null || str.trim().equals("")) {
return str;
}
StringBuilder re = new StringBuilder();
String[] words = str.split(" ");
for (int length = words.length, i = length - 1; i >= 0; i--) {
re.append(words[i]);
if (i != 0) {
re.append(" ");
}
}
return re.toString();
}
// charAt StringBuilder
public static String reverse2(String str) {
if (str == null || str.trim().equals("")) {
return str;
}
StringBuilder re = new StringBuilder(str.length());
int pos = 0;
for (int length = str.length(), i = 0; i < length; i++) {
char ch = str.charAt(i);
if (ch == ' ') {
pos = 0;
}
re.insert(pos, ch);
if (ch != ' ') {
pos++;
}
}
return re.toString();
}
// StringTokenizer Stack StringBuilder
public static String reverse3(String str) {
if (str == null || str.trim().equals("")) {
return str;
}
StringTokenizer token = new StringTokenizer(str, " ");
Stack stack = new Stack();
while (token.hasMoreElements()) {
stack.push(token.nextToken());
}
StringBuilder re = new StringBuilder(str.length());
for (int length = stack.size(), i = 0; !stack.isEmpty(); i++) {
re.append(stack.pop());
if (i != length - 1) {
re.append(" ");
}
}
return re.toString();
}
// charAt Stack StringBuilder
public static String reverse4(String str) {
if (str == null || str.trim().equals("")) {
return str;
}
Stack stack = new Stack();
final int RESET = -1;
int start = RESET;
for (int length = str.length(), i = 0; i < length; i++) {
char ch = str.charAt(i);
if (ch != ' ' && start == RESET) {// word started
start = i;
} else if ((ch == ' ') && start != RESET) {// find word
stack.push(str.substring(start, i));
start = RESET;
} else if ((i == length - 1) && start != RESET) {// find word
stack.push(str.substring(start, i + 1));
start = RESET;
}
}
StringBuilder re = new StringBuilder(str.length());
for (int length = stack.size(), i = 0; !stack.isEmpty(); i++) {
re.append(stack.pop());
if (i != length - 1) {
re.append(" ");
}
}
return re.toString();
}
public static void main(String[] args) {
long beginTime = System.currentTimeMillis();
System.out.println(reverse1(null) + "|");
System.out.println(reverse1("") + "|");
System.out.println(reverse1(" ") + "|");
System.out.println(reverse1(" ") + "|");
System.out.println(reverse1(" ") + "|");
System.out.println(reverse1(" BB ") + "|");
System.out.println(reverse1(" AA BB ") + "|");
System.out.println(reverse1("ABC is a pig.") + "|");
System.out.println(reverse1(" ABC is a pig. ") + "|");
reverse1(longString);
System.out.println("spend time:"
+ (System.currentTimeMillis() - beginTime));
beginTime = System.currentTimeMillis();
System.out.println(reverse2(null) + "|");
System.out.println(reverse2("") + "|");
System.out.println(reverse2(" ") + "|");
System.out.println(reverse2(" ") + "|");
System.out.println(reverse2(" ") + "|");
System.out.println(reverse2(" BB ") + "|");
System.out.println(reverse2(" AA BB ") + "|");
System.out.println(reverse2("ABC is a pig.") + "|");
System.out.println(reverse2(" ABC is a pig. ") + "|");
reverse2(longString);
System.out.println("spend time:"
+ (System.currentTimeMillis() - beginTime));
beginTime = System.currentTimeMillis();
System.out.println(reverse3(null) + "|");
System.out.println(reverse3("") + "|");
System.out.println(reverse3(" ") + "|");
System.out.println(reverse3(" ") + "|");
System.out.println(reverse3(" ") + "|");
System.out.println(reverse3(" BB ") + "|");
System.out.println(reverse3(" AA BB ") + "|");
System.out.println(reverse3("ABC is a pig.") + "|");
System.out.println(reverse3(" ABC is a pig. ") + "|");
reverse3(longString);
System.out.println("spend time:"
+ (System.currentTimeMillis() - beginTime));
beginTime = System.currentTimeMillis();
System.out.println(reverse4(null) + "|");
System.out.println(reverse4("") + "|");
System.out.println(reverse4(" ") + "|");
System.out.println(reverse4(" ") + "|");
System.out.println(reverse4(" ") + "|");
System.out.println(reverse4(" BB ") + "|");
System.out.println(reverse4(" AA BB ") + "|");
System.out.println(reverse4("ABC is a pig.") + "|");
System.out.println(reverse4(" ABC is a pig. ") + "|");
reverse4(longString);
System.out.println("spend time:"
+ (System.currentTimeMillis() - beginTime));
}
static String t = "das dasd sad asd sdsa as as dasd sdasdad adasdsd as dsa d asd sa d asd as das d sad asdd as das d asd as das d asd as d sad a sd asd as da sda ds ";
static String longString = t + t + t + t + t + t + t + t + t + t + t + t
+ t + t + t + t + t + t + t + t + t + t + t + t + t + t + t + t + t
+ t + t + t + t + t + t + t + t + t + t + t + t + t + t + t + t + t;
}
输出:
null|
|
|
|
|
BB |
BB AA |
pig. a is ABC|
pig. a is ABC |
spend time:14
null|
|
|
|
|
BB |
BB AA |
pig. a is ABC|
pig. a is ABC |
spend time:8
null|
|
|
|
|
BB|
BB AA|
pig. a is ABC|
pig. a is ABC|
spend time:5
null|
|
|
|
|
BB|
BB AA|
pig. a is ABC|
pig. a is ABC|
spend time:3
20120425写的新方法:
import java.util.Stack;
public class Demo {
/**
* 反转字符串的单词顺序
*/
public static void main(String[] args) {
String str = "hello world is demo";
System.out.println(reverse(str));
}
static String reverse(String str) {
StringBuilder sb = new StringBuilder(str.length());
Stack stack = new Stack();
int i = str.length() - 1;
while (i >= 0) {//从尾部开始遍历
char ch = str.charAt(i);
if (ch == ' ') {//遇到空格,则说明找到单词,将单词取出
while (!stack.isEmpty()) {
sb.append(stack.pop());
}
sb.append(ch);
} else {//遇到非空格,则字符入栈
stack.push(ch);
}
i--;
}
while (!stack.isEmpty()) {
sb.append(stack.pop());
}
return sb.toString();
}
}