Напишите метод для сортировки любого параметризованного типа набора и возврата набора деревьев

#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 of TreeSet , поскольку вам требуется, чтобы входные данные Set были из Comparable .