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

        字符串根据字典值排序问题,就是指对给定的字符串,按照首字母的字典值排序,如果首字母相同的字符串,则按照第二个字母,依次内推,比如说
{"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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值