Java对英文句子进行倒序排序

转自:http://www.sharejs.com/codes/java/6831

/**
 * 工具类
 * @author Administrator
 *
 */
public class Util {
    /**
     * 判断一个字符是否是字母
     * @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) {
        StringBuffer sb = new StringBuffer();
        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) {
        StringBuffer sb = new StringBuffer();
        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;
 
    public String reverse(String sentence) {
        if (sentence == null) {
            return null;
        }
        if (sentence.isEmpty()) {
            return "";
        }
 
        return _reverse02(sentence);
    }
 
    private String _reverse02(String sentence) {
        int size = sentence.length();
        char[] array = new char[size];
        sentence.getChars(0, size, array, 0);
 
        List<String> retStringList = new ArrayList<String>();
 
        String token = "";
        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;
    }
 
    private String processBEGIN(String token, char c) {
        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 input = "How are you";
        String expectResult = "you are How";
 
        String actualResult = process.reverse(input);
 
        assertEquals(expectResult, actualResult);
    }
 
    @Test
    public void test002() {
        String input = "How are  you";
        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 input = "How";
        String expectResult = "How";
 
        String actualResult = process.reverse(input);
 
        assertEquals(expectResult, actualResult);
    }
 
    @Test
    public void test008() {
        String input = "How ";
        String expectResult = "How";
 
        String actualResult = process.reverse(input);
 
        assertEquals(expectResult, actualResult);
    }
 
    @Test
    public void test009() {
        String input = " How ";
        String expectResult = "How";
 
        String actualResult = process.reverse(input);
 
        assertEquals(expectResult, actualResult);
    }
 
    @Test
    public void test010() {
        String input = "";
        String expectResult = "";
 
        String actualResult = process.reverse(input);
 
        assertEquals(expectResult, actualResult);
    }
 
    @Test
    public void test011() {
        String input = null;
        String expectResult = null;
 
        String actualResult = process.reverse(input);
 
        assertEquals(expectResult, actualResult);
    }
 
}

//该代码片段来自于: http://www.sharejs.com/codes/java/6831


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值