java带数字字母的字符串混合排序

import java.util.*;

public class NaturalOrderComparator implements Comparator {
    int compareRight(String a, String b) {
        int bias = 0, ia = 0, ib = 0;

        // The longest run of digits wins. That aside, the greatest
        // value wins, but we can't know that it will until we've scanned
        // both numbers to know that they have the same magnitude, so we
        // remember it in BIAS.
        for (; ; ia++, ib++) {
            char ca = charAt(a, ia);
            char cb = charAt(b, ib);

            if (!isDigit(ca) && !isDigit(cb)) {
                return bias;
            }
            if (!isDigit(ca)) {
                return -1;
            }
            if (!isDigit(cb)) {
                return +1;
            }
            if (ca == 0 && cb == 0) {
                return bias;
            }

            if (bias == 0) {
                if (ca < cb) {
                    bias = -1;
                } else if (ca > cb) {
                    bias = +1;
                }
            }
        }
    }

    @Override
    public int compare(Object o1, Object o2) {
        String a = o1.toString();
        String b = o2.toString();

        int ia = 0, ib = 0;
        int nza = 0, nzb = 0;
        char ca, cb;

        while (true) {
            // Only count the number of zeroes leading the last number compared
            nza = nzb = 0;

            ca = charAt(a, ia);
            cb = charAt(b, ib);

            // skip over leading spaces or zeros
            while (Character.isSpaceChar(ca) || ca == '0') {
                if (ca == '0') {
                    nza++;
                } else {
                    // Only count consecutive zeroes
                    nza = 0;
                }

                ca = charAt(a, ++ia);
            }

            while (Character.isSpaceChar(cb) || cb == '0') {
                if (cb == '0') {
                    nzb++;
                } else {
                    // Only count consecutive zeroes
                    nzb = 0;
                }

                cb = charAt(b, ++ib);
            }

            // Process run of digits
            if (Character.isDigit(ca) && Character.isDigit(cb)) {
                int bias = compareRight(a.substring(ia), b.substring(ib));
                if (bias != 0) {
                    return bias;
                }
            }

            if (ca == 0 && cb == 0) {
                // The strings compare the same. Perhaps the caller
                // will want to call strcmp to break the tie.
                return compareEqual(a, b, nza, nzb);
            }
            if (ca < cb) {
                return -1;
            }
            if (ca > cb) {
                return +1;
            }

            ++ia;
            ++ib;
        }
    }

    static boolean isDigit(char c) {
        return Character.isDigit(c) || c == '.' || c == ',';
    }

    static char charAt(String s, int i) {
        return i >= s.length() ? 0 : s.charAt(i);
    }

    static int compareEqual(String a, String b, int nza, int nzb) {
        if (nza - nzb != 0) {
            return nza - nzb;
        }

        if (a.length() == b.length()) {
            return a.compareTo(b);
        }

        return a.length() - b.length();
    }

    public static void main(String[] args) {
        String[] strings = new String[]{"a1bc100", "bca2543", "sfc2432", "abd345", "a11bc201",
                "abc2500", "abc432", "bcad3245", "abc1000", "abcd3243", "a2bc22432"};

        List orig = Arrays.asList(strings);

        System.out.println("Original: " + orig);

        List scrambled = Arrays.asList(strings);
        Collections.shuffle(scrambled);

        System.out.println("Scrambled: " + scrambled);

        Collections.sort(scrambled, new NaturalOrderComparator());

        System.out.println("Sorted: " + scrambled);

        //shuffle3000(scrambled);

        //compareSymmetric();

        //floatsWithCommas();
    }

    static void shuffle3000(List<? extends Object> scrambled) {
        Collections.shuffle(scrambled, new Random(3000));
        Collections.sort(scrambled, new NaturalOrderComparator());

        System.out.println("Sorted: " + scrambled);
    }

    static void compareSymmetric() {
        NaturalOrderComparator naturalOrderComparator = new NaturalOrderComparator();

        int compare1 = naturalOrderComparator.compare("1-2", "1-02");
        int compare2 = naturalOrderComparator.compare("1-02", "1-2");

        System.out.println(compare1 + " == " + compare2);

        compare1 = naturalOrderComparator.compare("pic 5", "pic05");
        compare2 = naturalOrderComparator.compare("pic05", "pic 5");

        System.out.println(compare1 + " == " + compare2);
    }

    static void floatsWithCommas() {
        List<String> unSorted = Arrays.asList("0.9", "1.0c", "1.2", "1.3", "0.6", "1.1", "0.7", "0.3", "1.0b", "1.0", "0.8");

        System.out.println("Unsorted: " + unSorted);

        unSorted.sort(new NaturalOrderComparator());

        System.out.println("Sorted: " + unSorted);
    }
}

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中可以使用Collections.sort()或Arrays.sort()方法对数组或集合进行排序。如果要对字母数字混合字符串进行排序,可以先将字符串转换为字符数组,再使用Arrays.sort()方法对字符数组进行排序排序时可以使用Java的中文字符比较器进行字符串排序。具体步骤如下: 1. 定义一个字符串数组用于存放要排序字符串。 2. 使用Arrays类的sort方法对字符串数组进行排序。在排序时,可以通过传递一个Comparator对象作为第二个参数来指定排序方式。 3. 创建一个实现Comparator接口的自定义比较器类。在比较器中重写compare方法,实现对字符串的比较排序。在比较器中,可以使用Java内置的Collator类进行中文字符的排序。 4. 在compare方法中根据字符串字母的ASCII码值进行升序排序。如果首字母相同,则比较第二个字符,以此类推。 5. 最后,使用Arrays.sort()方法进行排序,并输出排序后的结果。 举个例子,如果要对以下字符串进行排序: String[] strs = {"abc", "123", "中文", "bcd", "001"}; 我们可以使用以下代码进行排序: Arrays.sort(strs, new Comparator<String>() { @Override public int compare(String o1, String o2) { Collator collator = Collator.getInstance(Locale.CHINA); int result = collator.compare(o1, o2); if (result != 0) { return result; } char[] chars1 = o1.toCharArray(); char[] chars2 = o2.toCharArray(); int i = 0; while (i < chars1.length && i < chars2.length) { if (chars1[i] != chars2[i]) { return chars1[i] - chars2[i]; } i++; } return chars1.length - chars2.length; } }); 排序后的结果为: 001, 123, abc, bcd, 中文 以上就是Java字母数字混合字符串排序的方法,希望可以帮到您。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值