Как отсортировать коллекцию, которая имеет строки, целые и буквенно-цифровые символы в Java - PullRequest
1 голос
/ 27 сентября 2011

есть некоторые значения, такие как AB, A012B, CD, 1,10,01,9. Я должен отсортировать их, выходной должен быть 01,1,9,10, A012B, AB, CD может использовать любую коллекцию, которую я пытаюсьиспользовать функцию collection.sort, но она рассматривает все как строку и печатает, как 01,1,10,9, A012B, AB, CD, это не мое требование ... Просьба помочь

Ответы [ 5 ]

3 голосов
/ 27 сентября 2011

// рыболовная техника

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 голос
/ 27 сентября 2011

Вы должны реализовать Comparator.Я предполагаю, что все ваши данные в виде строк.Поэтому по умолчанию «10» предшествует «9».Вы должны это исправить, внедрив java.util.Comparator самостоятельно.

1 голос
/ 27 сентября 2011

вы должны реализовать компаратор:

данный объект O1 и объект O2:

вы сначала пытаетесь преобразовать их в числа и сравнить числа.

если O1 является числовым, а O2 - нет, то O2 должно быть больше O1

если O1 не числовой, а O2 числовой, тогда O1 считается больше, чем O1

если оба не являются числовыми, вы сравниваете их как строки.

0 голосов
/ 14 июня 2014

Ответ пользователя 952887 великолепен, за исключением того, что он все еще дает 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-который пользователь952887 исправил.

0 голосов
/ 27 сентября 2011

Сначала вы пишете свой Comparator, а затем звоните Collections.sort(List, Comparator)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...