如何在java中对包含字符串,整数和字母数字的集合进行排序

时间:2011-09-27 10:27:28

标签: java sorting collections

有一些值,如AB,A012B,CD,1,10,01,9 我必须排序他们 输出不好 01,1,9,10,A012B,AB,CD 可以使用任何集合 我试图使用collection.sort函数 但它把一切都视为字符串 和印刷如01,1,10,9,A012B,AB,CD 这不是我的要求...请帮忙

5 个答案:

答案 0 :(得分:3)

//捕鱼技术

List<String> values = new ArrayList<String>();
    values.add("AB");
    values.add("A012B");
    values.add("CD");
    values.add("1");
    values.add("10");
    values.add("01");
    values.add("9");
    values.add("I");
    Collections.sort(values, new Comparator<String>() {

        @Override
        public int compare(String o1, String o2) {
            // TODO tweak the comparator here 
            try{
            Integer integer1 = Integer.valueOf(o1);
            Integer integer2 = Integer.valueOf(o2);
            return integer1.compareTo(integer2);
            }catch (java.lang.NumberFormatException e) {
                return o1.compareTo(o2);
            }
        }
    });
    System.out.println(values);
}

//还不够???

//这是鱼

public static void main(String[] args) throws Exception {
    List<String> values = new ArrayList<String>();
    values.add("AB");
    values.add("A012B");
    values.add("CD");
    values.add("1");
    values.add("10");
    values.add("01");
    values.add("9");

    int maxLen = 0;
    for (String string : values) {
        if (string.length() > maxLen) {
            maxLen = string.length();
        }
    }

    Collections.sort(values, new MyComparator(maxLen));

    System.out.println(values);
}

public static class MyComparator implements Comparator<String> {
    private int maxLen;
    private static final String REGEX = "[0-9]+";

    public MyComparator(int maxLen) {
        this.maxLen = maxLen;

    }

    @Override
    public int compare(String obj1, String obj2) {
        String o1 = obj1;
        String o2 = obj2;
        // both numbers
        if (o1.matches("[1-9]+") && o2.matches("[1-9]+")) {
            Integer integer1 = Integer.valueOf(o1);
            Integer integer2 = Integer.valueOf(o2);
            return integer1.compareTo(integer2);
        }

        // both string
        if (o1.matches("[a-zA-Z]+") && o2.matches("[a-zA-Z]+")) {
            return o1.compareTo(o2);
        }

        Pattern p = Pattern.compile(REGEX);
        Matcher m1 = p.matcher(o1);
        Matcher m2 = p.matcher(o2);

        List<String> list = new ArrayList<String>();
        while (m1.find()) {
            list.add(m1.group());
        }
        for (String string : list) {
            o1.replaceFirst(string, leftPad(string, "0", maxLen));
        }

        list.clear();

        while (m2.find()) {
            list.add(m2.group());
        }
        for (String string : list) {
            o2.replaceFirst(string, leftPad(string, "0", maxLen));
        }
        return o1.compareTo(o2);

    }
}

public static String leftPad(String stringToPad, String padder, Integer size) {

    final StringBuilder strb = new StringBuilder(size.intValue());
    final StringCharacterIterator sci = new StringCharacterIterator(padder);

    while (strb.length() < (size.intValue() - stringToPad.length())) {
        for (char ch = sci.first(); ch != CharacterIterator.DONE; ch = sci.next()) {
            if (strb.length() < (size.intValue() - stringToPad.length())) {
                strb.insert(strb.length(), String.valueOf(ch));
            }
        }
    }

    return strb.append(stringToPad).toString();
}

答案 1 :(得分:1)

你应该实施一个比较器:

给定对象O1和对象O2:

首先尝试将它们转换为数字并比较数字。

如果O1是数字而O2不是,那么O2将被大于O1

如果O1不是数字且O2是数字,则认为O1大于O1

如果两者都不是数字,则将它们作为字符串进行比较。

答案 2 :(得分:1)

您必须实施Comparator。我假设您的所有数据都是字符串形式。因此默认情况下,“10”出现在“9”之前。您需要通过自己实现java.util.Comparator来解决这个问题。

答案 3 :(得分:0)

首先,您自己编写Comparator,然后致电Collections.sort(List, Comparator)

答案 4 :(得分:0)

User952887的答案很棒,除了它仍然给出0,01,1,10,11,2,21,3,4,5 ......等(通知10在1之后和2之前)。查看以下链接,找到一个很棒的字母数字比较器,它将返回0,1,2,3,4,5,10,11,21 http://sanjaal.com/java/tag/sample-alphanumeric-sorting/唯一的问题是它将返回0,1,01- User952887已修复。