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