[Java] Java对英文句子进行倒序排序 →→→→→进入此内容的聊天室

来自 , 2020-09-19, 写在 Java, 查看 156 次.
URL http://www.code666.cn/view/6d38b80c
  1. /**
  2.  * 工具类
  3.  * @author Administrator
  4.  *
  5.  */
  6. public class Util {
  7.     /**
  8.      * 判断一个字符是否是字母
  9.      * @param c
  10.      * @return
  11.      */
  12.     public static boolean isChar(char c) {
  13.         return c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z';
  14.     }
  15.  
  16.     /**
  17.      * 判断一个数字是否是数字
  18.      * @param c
  19.      * @return
  20.      */
  21.     public static boolean isNumber(char c) {
  22.         return c >= '0' && c <= '9';
  23.     }
  24.  
  25.     /**
  26.      * 将List中的元素拼接成字符串,拼接符为split
  27.      * @param list
  28.      * @param split
  29.      * @return
  30.      */
  31.     public static <T> String list2String(List<T> list, String split) {
  32.         StringBuffer sb = new StringBuffer();
  33.         for (T t : list) {
  34.             sb.append(t.toString());
  35.             sb.append(split);
  36.         }
  37.         return sb.substring(0, sb.length() - split.length());
  38.     }
  39.  
  40.     /**
  41.      * 将List中的元素反序厚拼接成字符串,拼接符为split
  42.      * @param list
  43.      * @param split
  44.      * @return
  45.      */
  46.     public static <T> String list2String_reverse(List<T> list, String split) {
  47.         StringBuffer sb = new StringBuffer();
  48.         for (int i = list.size() - 1; i >= 0; --i) {
  49.             sb.append(list.get(i).toString());
  50.             sb.append(split);
  51.         }
  52.         return sb.substring(0, sb.length() - split.length());
  53.     }
  54. }
  55.  
  56.  
  57. /**
  58.  * 句子倒序 单词的约束:字母或者数字,中间可以有一个连接符-
  59.  *          单词间的分隔符可以是:一个或者多个空格,多余一个的连接符-,
  60.  *          其他非字母或者数字的字符
  61.  *
  62.  * @param input:一个若干个单词和间隔符组成的字符串
  63.  * @return:按照单词倒序的句子。单词间的间隔使用一个空格
  64.  */
  65. public class SentenceReverser {
  66.     private static final int BEGIN = 0;
  67.     private static final int SPLIT = 1;
  68.     private static final int WORD = 2;
  69.     private static final int WORDENDWITH_ = 3;
  70.      
  71.     private int status = BEGIN;
  72.  
  73.     public String reverse(String sentence) {
  74.         if (sentence == null) {
  75.             return null;
  76.         }
  77.         if (sentence.isEmpty()) {
  78.             return "";
  79.         }
  80.  
  81.         return _reverse02(sentence);
  82.     }
  83.  
  84.     private String _reverse02(String sentence) {
  85.         int size = sentence.length();
  86.         char[] array = new char[size];
  87.         sentence.getChars(0, size, array, 0);
  88.  
  89.         List<String> retStringList = new ArrayList<String>();
  90.  
  91.         String token = "";
  92.         status = BEGIN;
  93.         for (char c : array) {
  94.             if (status == BEGIN) {
  95.                 token = processBEGIN(token, c);
  96.             } else if (status == WORD) {
  97.                 token = processWORD(retStringList, token, c);
  98.             } else if (status == SPLIT) {
  99.                 token = processSPLIT(retStringList, token, c);
  100.             } else if (status == WORDENDWITH_) {
  101.                 token = processWORDWITH_(retStringList, token, c);
  102.             }
  103.         }
  104.         if (!token.isEmpty()) {
  105.             processLastToken(retStringList, token);
  106.         }
  107.  
  108.         return Util.list2String_reverse(retStringList, "")
  109.                 .replaceAll(" +", " ").trim();
  110.  
  111.     }
  112.  
  113.     private void processLastToken(List<String> retStringList, String token) {
  114.         if (status == WORD) {
  115.             addWord(retStringList, token);
  116.         } else if (status == SPLIT) {
  117.             addSplit(retStringList, token);
  118.         } else if (status == WORDENDWITH_) {
  119.             String word = token.substring(0, token.length() - 1);
  120.             addWord(retStringList, word);
  121.             addSplit(retStringList, "-");
  122.         }
  123.     }
  124.  
  125.     private String processWORDWITH_(List<String> retStringList, String token, char c) {
  126.         if (this.isCharOrNumber(c)) {
  127.             token += c;
  128.             status = WORD;
  129.         } else {
  130.             String word = token.substring(0, token.length() - 1);
  131.             addWord(retStringList, word);
  132.             token = "-";
  133.             token += c;
  134.             status = SPLIT;
  135.         }
  136.         return token;
  137.     }
  138.  
  139.     private String processSPLIT(List<String> retStringList, String token, char c) {
  140.         if (this.isCharOrNumber(c)) {
  141.             addSplit(retStringList, token);
  142.             token = "";
  143.             token += c;
  144.             status = WORD;
  145.         } else {
  146.             token += c;
  147.         }
  148.         return token;
  149.     }
  150.  
  151.     private String processWORD(List<String> retStringList, String token, char c) {
  152.         if (this.isCharOrNumber(c)) {
  153.             token += c;
  154.             status = WORD;
  155.         } else if (c == '-') {
  156.             token += c;
  157.             status = WORDENDWITH_;
  158.         } else {
  159.             addWord(retStringList, token);
  160.             token = "";
  161.             token += c;
  162.             status = SPLIT;
  163.         }
  164.         return token;
  165.     }
  166.  
  167.     private String processBEGIN(String token, char c) {
  168.         if (this.isCharOrNumber(c)) {
  169.             token += c;
  170.             status = WORD;
  171.         } else {
  172.             token += c;
  173.             status = SPLIT;
  174.         }
  175.         return token;
  176.     }
  177.  
  178.     private void addWord(List<String> list, String word) {
  179.         list.add(word);
  180.     }
  181.  
  182.     private void addSplit(List<String> list, String split) {
  183.         list.add(" ");
  184.         // list.add(split);
  185.     }
  186.  
  187.     private boolean isCharOrNumber(char c) {
  188.         return Util.isChar(c) || Util.isNumber(c);
  189.     }
  190. }
  191.  
  192. /**
  193.  * 测试代码
  194.  */
  195. import static org.junit.Assert.*;
  196. import org.junit.Before;
  197. import org.junit.Test;
  198.  
  199. public class ReverseSentenceTest {
  200.     private SentenceReverser process;
  201.  
  202.     @Before
  203.     public void before() {
  204.         process = new SentenceReverser();
  205.     }
  206.  
  207.     @Test
  208.     public void test001() {
  209.         String input = "How are you";
  210.         String expectResult = "you are How";
  211.  
  212.         String actualResult = process.reverse(input);
  213.  
  214.         assertEquals(expectResult, actualResult);
  215.     }
  216.  
  217.     @Test
  218.     public void test002() {
  219.         String input = "How are  you";
  220.         String expectResult = "you are How";
  221.  
  222.         String actualResult = process.reverse(input);
  223.  
  224.         assertEquals(expectResult, actualResult);
  225.     }
  226.  
  227.     @Test
  228.     public void test003() {
  229.         String input = "How are--you";
  230.         String expectResult = "you are How";
  231.  
  232.         String actualResult = process.reverse(input);
  233.  
  234.         assertEquals(expectResult, actualResult);
  235.     }
  236.  
  237.     @Test
  238.     public void test004() {
  239.         String input = "How ar-e--you";
  240.         String expectResult = "you ar-e How";
  241.  
  242.         String actualResult = process.reverse(input);
  243.  
  244.         assertEquals(expectResult, actualResult);
  245.     }
  246.  
  247.     @Test
  248.     public void test005() {
  249.         String input = "How?ar-e--you";
  250.         String expectResult = "you ar-e How";
  251.  
  252.         String actualResult = process.reverse(input);
  253.  
  254.         assertEquals(expectResult, actualResult);
  255.     }
  256.  
  257.     @Test
  258.     public void test006() {
  259.         String input = "How are- you";
  260.         String expectResult = "you are How";
  261.  
  262.         String actualResult = process.reverse(input);
  263.  
  264.         assertEquals(expectResult, actualResult);
  265.     }
  266.  
  267.     @Test
  268.     public void test007() {
  269.         String input = "How";
  270.         String expectResult = "How";
  271.  
  272.         String actualResult = process.reverse(input);
  273.  
  274.         assertEquals(expectResult, actualResult);
  275.     }
  276.  
  277.     @Test
  278.     public void test008() {
  279.         String input = "How ";
  280.         String expectResult = "How";
  281.  
  282.         String actualResult = process.reverse(input);
  283.  
  284.         assertEquals(expectResult, actualResult);
  285.     }
  286.  
  287.     @Test
  288.     public void test009() {
  289.         String input = " How ";
  290.         String expectResult = "How";
  291.  
  292.         String actualResult = process.reverse(input);
  293.  
  294.         assertEquals(expectResult, actualResult);
  295.     }
  296.  
  297.     @Test
  298.     public void test010() {
  299.         String input = "";
  300.         String expectResult = "";
  301.  
  302.         String actualResult = process.reverse(input);
  303.  
  304.         assertEquals(expectResult, actualResult);
  305.     }
  306.  
  307.     @Test
  308.     public void test011() {
  309.         String input = null;
  310.         String expectResult = null;
  311.  
  312.         String actualResult = process.reverse(input);
  313.  
  314.         assertEquals(expectResult, actualResult);
  315.     }
  316.  
  317. }
  318.  
  319. //java/6831

回复 "Java对英文句子进行倒序排序"

这儿你可以回复上面这条便签

captcha