#java #sorting #set #treeset
#java #сортировка #набор #набор деревьев
Вопрос:
Как я могу создать реализацию, в которой, учитывая набор любого параметризованного типа, можно сортировать его и возвращать набор деревьев с отсортированными элементами.
Это то, что я пробовал до сих пор. Это работает только для строковых и целых типов, хотя я пытаюсь работать с любым типом. Итак, приведенный ниже код является моей реализацией. Я получаю ошибку в методе addAll, потому что он ожидает коллекцию в качестве своего аргумента
public class SortingSets {
public static void main(String[] args) {
Set<String> set = new HashSet<String>();
set.add("C");
set.add("B");
set.add("G");
set.add("R");
set.add("A");
set.add("D");
set.add("L");
Set<Integer> intSet = new HashSet<>();
intSet.add(5);
intSet.add(4);
intSet.add(2);
intSet.add(7);
intSet.add(22);
intSet.add(92);
intSet.add(9);
intSet.add(3);
intSet.add(10);
printSet(set);
System.out.println();
printSet(intSet);
System.out.println("printing the set in sorted order");
Set<? extends Object> treeSet = constructTreeSet(set);
printSet(treeSet);
}
private static Set<? extends Object> constructTreeSet(Set<? extends Object> set) {
Set<? extends Object> resultSet;
for(Object o : set) {
if (o instanceof String) {
resultSet = new TreeSet<String>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// TODO Auto-generated method stub
return o1.compareTo(o2);
}
});
resultSet.addAll(set);
} else {
resultSet = new TreeSet<Integer>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
return o1.compareTo(o2);
}
});
}
}
return new TreeSet<Object>();
}
private static void printSet(Set<?> set) {
for(Object i : set) {
System.out.println(i);
}
}
}
Комментарии:
1. Подсказка:
public static <T extends Comparable<? super T>> TreeSet<T> toSortedSet(Set<T> set)
2. «сортировать любой параметризованный тип набора», если тип является
Comparable
, то для сортировки доступен естественный порядок, и вам не нужно делать ничего особенного. Однако, если тип не реализуетсяComparable
, каким должен быть порядок сортировки? Вопрос определен не полностью. — Подсказка: обаString
иInteger
реализуютComparable
, поэтому вам не нужно было создавать эти анонимныеComparator
классы.3. Спасибо, Борис. Это решило проблему.
Ответ №1:
Моя обновленная и рабочая реализация выглядит следующим образом
public class SortingSets {
public static void main(String[] args) {
Set<String> set = new HashSet<String>();
set.add("C");
set.add("B");
set.add("G");
set.add("R");
set.add("A");
set.add("D");
set.add("L");
Set<Integer> intSet = new HashSet<>();
intSet.add(5);
intSet.add(4);
intSet.add(2);
intSet.add(7);
intSet.add(22);
intSet.add(92);
intSet.add(9);
intSet.add(3);
intSet.add(10);
printSet(set);
System.out.println();
printSet(intSet);
System.out.println("printing the set in sorted order");
Set<?> treeSet = constructTreeSet(intSet);
printSet(treeSet);
}
private static <T extends Object amp; Comparable<T>> Set<T> constructTreeSet(Set<T> set) {
Set<T> treeSet = new TreeSet<T>(new Comparator<T>() {
@Override
public int compare(T o1, T o2) {
return o1.compareTo(o2);
}
});
treeSet.addAll(set);
return treeSet;
}
private static void printSet(Set<?> set) {
for(Object i : set) {
System.out.println(i);
}
}
}
Спасибо Борису Пауку за подсказку
Комментарии:
1. Вы можете использовать
Comparator.naturalOrder()
или даже просто передать входные данные непосредственно в ctor ofTreeSet
, поскольку вам требуется, чтобы входные данныеSet
были изComparable
.