字符串根据字典值排序问题

来源:互联网 发布:数到五答应我网络歌手 编辑:程序博客网 时间:2024/05/16 08:37
        字符串根据字典值排序问题,就是指对给定的字符串,按照首字母的字典值排序,如果首字母相同的字符串,则按照第二个字母,依次内推,比如说
{"dog","dear","eye","bed"},排序后应该是{"bed","dear","dog","eye"}
       刚开始接触到这个问题时候,当时想着排序首先按照第一个字母,如果第一个字母相同的那些字符串,再归为一类,再按照第二个字母排序。。。依次类推。
所以不由自主想到了递归,这样问题就变得比较复杂。
后来仔细想了一下,在这个问题上,我开始时候思路就陷入了一个误区,不妨可以按照以下思路重新思考这个问题:
     这个问题和普通的数字排序有什么本质区别?
    普通的数字排序是根据数字的”大小“关系排序 ,那么这个问题呢?其实也是根据字符串的”大小“关系排序,只不过数字的大小关系可能比较简单,我们用一个比较运算符立马可以得到结果,而字符串之间的大小关系,稍微复杂了一点点,得将字符串中的字符拆开来,分别比较,直到比较出结果为止。
      这样看来,其实这个排序和普通的排序的唯一区别就是:在比较”大小“的方法上,略有差异,其他逻辑居然完全一样。所以,我们依然可以用传统的排序方法,解决这个问题,唯一需要做的就是,重新写一个比较大小的方法即可。

下面是用最简单的”冒泡排序“实现的一段代码:

public class SortByDictionary {public static boolean bigger(String s1, String s2) {int length1 = s1.length();int length2 = s2.length();int i = 0;while (i < length1 && i < length2) {if (s1.charAt(i) > s2.charAt(i)) {return true;} else if (s1.charAt(i) < s2.charAt(i)) {return false;} else {i++;}}if (i == length1) {return false;} else {return true;}}public static void main(String[] args) {String[] s = { "dog", "dear", "eye", "bed", "do", "hello", "zero","fire", "hc", "zz" };for (int i = 0; i < s.length - 1; i++) {boolean change = false; // 用作冒泡排序的标记,如果一趟排序存在交换,则change设为true,说明还需要下一趟排序for (int j = 0; j < s.length - i - 1; j++) {if (bigger(s[j], s[j + 1])) {// swap(s[j], s[j + 1]);String tmp = s[j];s[j] = s[j + 1];s[j + 1] = tmp;change = true;}}if (!change) {break; // 当change为false的时候,说明不需要再冒泡了}}for (int i = 0; i < s.length; i++) {System.out.print(s[i] + " ");}}}

0 0