两个String字符串比较大小(ASCII)

java实际开发中常常遇到两个字符串比较大小:比如:java1a、java2a、c++。
假设我们通过String转成int再去比较大小。Integer.parseInt(“C++”),这个时候因为“C++”里边没有数字,就会报错,所以比较好的方式就是通过将字符串变成ASCII码,再通过ASCII比较大小。

 private static int compareByName(String name1, String name2) {
        final byte[] bytes1 = name1.getBytes();
        final byte[] bytes2 = name2.getBytes();
        int i = 0;
        byte b1, b2;
        int numCompare = 0;//如果都是数字, 那么需要比较连续数字的大小, 只要高位大, 这个数字就大
        for (; i < Math.min(bytes1.length, bytes2.length); i++) {
            b1 = bytes1[i];
            b2 = bytes2[i];
            if (b1 != b2) {//只有ascii不相等时才比较
                if (numCompare != 0
                        && !(b1 >= 48 && b1 <= 57)
                        && !(b2 >= 48 && b2 <= 57)) {//已经出现过不等的数字,并且这个循环都是字符的情况
                    return numCompare;
                }
                if (b1 >= 48 && b1 <= 57
                        && b2 >= 48 && b2 <= 57) {//只有都是数字才会进入
                    if (numCompare == 0)
                        numCompare = Byte.compare(b1, b2);
                } else {//其中一个是数字,或者都是字符
                    if (numCompare != 0) {//已经出现过数字,那么本次循环哪个是数字,说明哪个数字位数多,那么这个数字就大
                        if (b1 >= 48 && b1 <= 57)
                            return 1;
                        if (b2 >= 48 && b2 <= 57)
                            return -1;
                    }
                    return Byte.compare(b1, b2);
                }
            }
        }
        if (numCompare == 0)//说明长度较小的部分完全一样,比较哪个长度大
            return Integer.compare(bytes1.length, bytes2.length);
        else {
            if (bytes1.length > bytes2.length) {
                if (bytes1[i] >= 48 && bytes1[i] <= 57)
                    return 1;
                else
                    return numCompare;
            }
            if (bytes1.length < bytes2.length) {
                if (bytes2[i] >= 48 && bytes2[i] <= 57)
                    return -1;
                else
                    return numCompare;
            }
            return numCompare;//出现过数字且不相同,并且最后一位不是字符
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值