/**
* 工具类
* @author Administrator
*
*/
/**
* 判断一个字符是否是字母
* @param c
* @return
*/
public static boolean isChar(char c) {
return c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z';
}
/**
* 判断一个数字是否是数字
* @param c
* @return
*/
public static boolean isNumber(char c) {
return c >= '0' && c <= '9';
}
/**
* 将List中的元素拼接成字符串,拼接符为split
* @param list
* @param split
* @return
*/
public static <T
> String list2String
(List
<T
> list,
String split
) {
for (T t : list) {
sb.append(t.toString());
sb.append(split);
}
return sb.substring(0, sb.length() - split.length());
}
/**
* 将List中的元素反序厚拼接成字符串,拼接符为split
* @param list
* @param split
* @return
*/
public static <T
> String list2String_reverse
(List
<T
> list,
String split
) {
for (int i = list.size() - 1; i >= 0; --i) {
sb.append(list.get(i).toString());
sb.append(split);
}
return sb.substring(0, sb.length() - split.length());
}
}
/**
* 句子倒序 单词的约束:字母或者数字,中间可以有一个连接符-
* 单词间的分隔符可以是:一个或者多个空格,多余一个的连接符-,
* 其他非字母或者数字的字符
*
* @param input:一个若干个单词和间隔符组成的字符串
* @return:按照单词倒序的句子。单词间的间隔使用一个空格
*/
public class SentenceReverser {
private static final int BEGIN = 0;
private static final int SPLIT = 1;
private static final int WORD = 2;
private static final int WORDENDWITH_ = 3;
private int status = BEGIN;
if (sentence == null) {
return null;
}
if (sentence.isEmpty()) {
return "";
}
return _reverse02(sentence);
}
int size = sentence.length();
char[] array = new char[size];
sentence.getChars(0, size, array, 0);
List<String> retStringList = new ArrayList<String>();
status = BEGIN;
for (char c : array) {
if (status == BEGIN) {
token = processBEGIN(token, c);
} else if (status == WORD) {
token = processWORD(retStringList, token, c);
} else if (status == SPLIT) {
token = processSPLIT(retStringList, token, c);
} else if (status == WORDENDWITH_) {
token = processWORDWITH_(retStringList, token, c);
}
}
if (!token.isEmpty()) {
processLastToken(retStringList, token);
}
return Util.
list2String_reverse(retStringList,
"")
.replaceAll(" +", " ").trim();
}
private void processLastToken
(List
<String
> retStringList,
String token
) {
if (status == WORD) {
addWord(retStringList, token);
} else if (status == SPLIT) {
addSplit(retStringList, token);
} else if (status == WORDENDWITH_) {
String word
= token.
substring(0, token.
length() - 1);
addWord(retStringList, word);
addSplit(retStringList, "-");
}
}
private String processWORDWITH_
(List
<String
> retStringList,
String token,
char c
) {
if (this.isCharOrNumber(c)) {
token += c;
status = WORD;
} else {
String word
= token.
substring(0, token.
length() - 1);
addWord(retStringList, word);
token = "-";
token += c;
status = SPLIT;
}
return token;
}
private String processSPLIT
(List
<String
> retStringList,
String token,
char c
) {
if (this.isCharOrNumber(c)) {
addSplit(retStringList, token);
token = "";
token += c;
status = WORD;
} else {
token += c;
}
return token;
}
private String processWORD
(List
<String
> retStringList,
String token,
char c
) {
if (this.isCharOrNumber(c)) {
token += c;
status = WORD;
} else if (c == '-') {
token += c;
status = WORDENDWITH_;
} else {
addWord(retStringList, token);
token = "";
token += c;
status = SPLIT;
}
return token;
}
if (this.isCharOrNumber(c)) {
token += c;
status = WORD;
} else {
token += c;
status = SPLIT;
}
return token;
}
private void addWord
(List
<String
> list,
String word
) {
list.add(word);
}
private void addSplit
(List
<String
> list,
String split
) {
list.add(" ");
// list.add(split);
}
private boolean isCharOrNumber(char c) {
return Util.
isChar(c
) || Util.
isNumber(c
);
}
}
/**
* 测试代码
*/
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
public class ReverseSentenceTest {
private SentenceReverser process;
@Before
public void before() {
process = new SentenceReverser();
}
@Test
public void test001() {
String expectResult
= "you are How";
String actualResult
= process.
reverse(input
);
assertEquals(expectResult, actualResult);
}
@Test
public void test002() {
String expectResult
= "you are How";
String actualResult
= process.
reverse(input
);
assertEquals(expectResult, actualResult);
}
@Test
public void test003() {
String input
= "How are--you";
String expectResult
= "you are How";
String actualResult
= process.
reverse(input
);
assertEquals(expectResult, actualResult);
}
@Test
public void test004() {
String input
= "How ar-e--you";
String expectResult
= "you ar-e How";
String actualResult
= process.
reverse(input
);
assertEquals(expectResult, actualResult);
}
@Test
public void test005() {
String input
= "How?ar-e--you";
String expectResult
= "you ar-e How";
String actualResult
= process.
reverse(input
);
assertEquals(expectResult, actualResult);
}
@Test
public void test006() {
String input
= "How are- you";
String expectResult
= "you are How";
String actualResult
= process.
reverse(input
);
assertEquals(expectResult, actualResult);
}
@Test
public void test007() {
String actualResult
= process.
reverse(input
);
assertEquals(expectResult, actualResult);
}
@Test
public void test008() {
String actualResult
= process.
reverse(input
);
assertEquals(expectResult, actualResult);
}
@Test
public void test009() {
String actualResult
= process.
reverse(input
);
assertEquals(expectResult, actualResult);
}
@Test
public void test010() {
String actualResult
= process.
reverse(input
);
assertEquals(expectResult, actualResult);
}
@Test
public void test011() {
String actualResult
= process.
reverse(input
);
assertEquals(expectResult, actualResult);
}
}
//java/6831