Java中文中含有数字以数字顺序排序

package com.allen.es.demo.service;

import java.text.Collator;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class OrderWrapper implements Comparable {
    String name;

    public OrderWrapper(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return String.valueOf(name);
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }
        if (obj instanceof OrderWrapper) {
            OrderWrapper other = (OrderWrapper) obj;
            return null == this.name ? false : this.name.equals(other.name);
        }
        return false;
    }

    @Override
    public int compareTo(Object o) {
        OrderWrapper wrapper = (OrderWrapper) o;
        if (null == wrapper) {
            return 1;
        }
        if (this == wrapper || this.equals(wrapper)) {
            return 0;
        }
        String name1 = this.name;
        String name2 = wrapper.name;
        if (null == name1) {
            return null == name2 ? 0 : -1;
        } else if (null == name2) {
            return 1;
        }
        Pattern pattern = Pattern.compile("\\D*(\\d+)\\D*");
        Matcher matcher1 = pattern.matcher(name1);
        Matcher matcher2 = pattern.matcher(name2);
        int index1 = 0;
        int index2 = 0;
        while (matcher1.find()) {
            String s1 = matcher1.group(1);
            String s2;
            if (matcher2.find()) {
                s2 = matcher2.group(1);
            } else {
                break;
            }
            index1 = name1.indexOf(s1, index1);
            index2 = name2.indexOf(s2, index2);
            if (index1 != index2) {
                break;
            }
            String pre1 = name1.substring(0, index1);
            String pre2 = name2.substring(0, index2);
            if (!Objects.equals(pre1, pre2)) {
                break;
            }
            long num1 = Long.parseLong(s1);
            long num2 = Long.parseLong(s2);
            if (num1 == num2) {
                name1 = name1.substring(s1.length());
                name2 = name2.substring(s2.length());
                continue;
            } else {
                return (int) (num1 - num2);
            }
        }
        return Collator.getInstance(Locale.CHINA).compare(this.name, wrapper.name);
    }

    public static void testNew() {
        List<OrderWrapper> chinesesOrderList = new ArrayList();
        chinesesOrderList.add(new OrderWrapper("【】"));
        chinesesOrderList.add(new OrderWrapper("【2】你是1"));
        chinesesOrderList.add(new OrderWrapper("【1】你是111"));
        chinesesOrderList.add(new OrderWrapper("【1】你是22吗"));
        chinesesOrderList.add(new OrderWrapper("【1】你是11吗"));
        chinesesOrderList.add(new OrderWrapper("【1】你是2吗"));
        chinesesOrderList.add(new OrderWrapper("【1】你是1吗"));
     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值