Подтвердить что ты не робот

Сортировка значений набора

Я пытаюсь сортировать элементы набора, но не могу сделать это. вот мой код, который я пытаюсь сделать

public static void main(String [] args){
    Set<String> set=new HashSet<String>();
    set.add("12");
    set.add("15");
    set.add("5");
    List<String> list=asSortedList(set);
}

public static
<T extends Comparable<? super T>> List<T> asSortedList(Collection<T> c) {
  List<T> list = new ArrayList<T>(c);
  Collections.sort(list);
  return list;
}

но тот или иной способ не работает, поскольку все это время дает мне тот же порядок, в котором они были заполнены 12,15,5

4b9b3361

Ответ 1

Если сортировать строки "12", "15" и "5", то "5" приходит последним, потому что "5" > "1". то есть естественный порядок строк не работает так, как вы ожидаете.

Если вы хотите хранить строки в своем списке, но сортировать их численно, вам нужно будет использовать компаратор, который обрабатывает это. например.

Collections.sort(list, new Comparator<String>() {
    public int compare(String o1, String o2) {
        Integer i1 = Integer.parseInt(o1);
        Integer i2 = Integer.parseInt(o2);
        return (i1 > i2 ? -1 : (i1 == i2 ? 0 : 1));
    }
});

Кроме того, я думаю, что вы слегка смешиваетесь между типами Collection. A HashSet и a HashMap - разные вещи.

Ответ 2

Используйте SortedSet (TreeSet является стандартным):

SortedSet<String> set=new TreeSet<String>();
set.add("12");
set.add("15");
set.add("5");
List<String> list=new ArrayList<String>(set);

Нет необходимости в дополнительном коде сортировки.

О, я вижу, вы хотите другой порядок сортировки. Поместите компаратор в TreeSet:

new TreeSet<String>(Comparator.comparing(Integer::valueOf));

Теперь ваш TreeSet будет сортировать строки в числовом порядке (что подразумевает, что он будет генерировать исключения, если вы отправляете нечисловые строки)

Справка:

Ответ 3

Вы используете компаратор по умолчанию для сортировки a Set<String>. В этом случае это означает лексикографический порядок. Лексикографически "12" предшествует "15", предшествует "5".

Используйте либо Set<Integer>:

Set<Integer> set=new HashSet<Integer>();
set.add(12);
set.add(15);
set.add(5);

Или используйте другой компаратор:

Collections.sort(list, new Comparator<String>() {
    public int compare(String a, String b) {
        return Integer.parseInt(a) - Integer.parseInt(b);
    }
});

Ответ 4

Используйте класс оболочки Integer вместо String, потому что он выполняет тяжелую работу, реализуя Comparable<Integer>. Тогда java.util.Collections.sort(list); выполнит трюк.

Ответ 5

Строки сортируются лексикографически. Поведение, которое вы видите, верное.

Определите собственный компаратор для сортировки строк, однако вы предпочитаете.

Он также будет работать так, как вы ожидаете (5 в качестве первого элемента), если вы изменили свои коллекции на Integer вместо использования String.

Ответ 6

Вам нужно передать экземпляр Comparator в метод сортировки, иначе элементы будут отсортированы в естественном порядке.

Для получения дополнительной информации проверьте Collections.sort(List, Comparator)