Natural Comparator

63 篇文章 0 订阅

注意corner cases:

自然string comparator。不知道的搜下。就是string 比较的时候考虑里面数字的大小,比如 abc9 < abc123 abc > ab9  因为char比digit重要。

public class NaturalComparator implements Comparator<String> {
    public static void main(String[] args) {
        NaturalComparator NaturalComparator = new NaturalComparator();
        System.out.println(NaturalComparator.compare("abc22a", "abc22z"));
        System.out.println(NaturalComparator.compare("abc23", "abz22"));
        ;
        System.out.println(NaturalComparator.compare("abc", "999"));
        System.out.println(NaturalComparator.compare("abc22ac43", "abc22ac7"));
    }


    @Override
    public int compare(String s1, String s2) {
        // TODO Auto-generated method stub
        if (s1 == null && s2 == null) {
            return 0;
        }
        else if (s1 == null && s2 != null) {
            return 1;
        }
        else if (s1 != null && s2 == null) {
            return -1;
        }
        else if (s1.equals(s2)) {
            return 0;
        }
        int a1 = 0, a2 = 0;
        int b1 = 0, b2 = 0;
        //find break point
        boolean isDigit = true;
        while (b1 < s1.length() && !Character.isDigit(s1.charAt(b1)))
            b1++;
        while (b2 < s2.length() && !Character.isDigit(s2.charAt(b2)))
            b2++;
        int cmp = s1.substring(a1, b1).compareTo(s2.substring(a2, b2));
        while (cmp == 0) {
            a1 = b1;
            a2 = b2;
            if (isDigit) {
                while (b1 < s1.length() && Character.isDigit(s1.charAt(b1)))
                    b1++;
                while (b2 < s2.length() && Character.isDigit(s2.charAt(b2)))
                    b2++;
                isDigit = false;
                cmp = Integer.valueOf(s1.substring(a1, b1)) - Integer.valueOf(s2.substring(a2, b2));
            }
            else {
                while (b1 < s1.length() && !Character.isDigit(s1.charAt(b1)))
                    b1++;
                while (b2 < s2.length() && !Character.isDigit(s2.charAt(b2)))
                    b2++;
                isDigit = true;
                cmp = s1.substring(a1, b1).compareTo(s2.substring(a2, b2));
            }
        }
        if (cmp > 0)
            return 1;
        else if (cmp < 0)
            return -1;
        else
            return cmp;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值