Collections.sort() 可以将 treeSet 作为第一个参数吗?如果不是为什么?

Can Collections.sort() take treeSet as first argument? If not why?

我的 'Person' class 如下 -

public class Person implements Comparable<Person> {
    private int marks;
    private String name;

    Person(int marks, String name) {
        this.marks = marks;
        this.name = name;
    }

    public int getMarks() {
        return marks;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Person: Marks = " + marks + ", Name =  " + name;
    }

    @Override
    public int compareTo(Person person) {
        return marks > person.marks ? 1 : -1;
    }
}

现在在 main method 我创建了另一个 comparator 与相反 sorting -

Comparator<Person> comparator = new Comparator<Person>() {
            @Override
            public int compare(Person p1, Person p2) {
                int marks1 = p1.getMarks();
                int marks2 = p2.getMarks();
                return marks1 > marks2 ? -1 : 1;
            }
        };

现在,我创建一个 TreeSet -

TreeSet<Person> treeSet1 = new TreeSet<>(List.of(
                new Person(67, "Himani"),
                new Person(73, "Hasani"),
                new Person(21, "Rohini")
        ));

现在,我尝试将 treeSet 作为参数传递给 Collections.sort() -

Collections.sort(treeSet1, comparator);

在这里,我得到以下错误-


Required type                         Provided

list:List<T>                         TreeSet<Person>
                              
c:Comparator<? super T>              Comparator<Person>

据我可以从错误中推断出 - Collections.sort()comparator 只能用于 List 而不能用于 Set

我说的对吗?如果不是我哪里错了?如果是,为什么我是对的?

Collections.sort 的第一个参数是 List<T> 类型。所以你只能传递 List 个对象给它,而不是 Set 个对象,或者其他任何东西。

这是明智的。原因是 Set 对象有两种类型。

  • 有一些,就其性质而言,总是未排序的,例如 HashSet。对这些进行排序没有意义。
  • 有一些,就其性质而言,总是以相同的方式排序,例如 TreeSet。对这些进行排序没有意义,因为它们已经排序了。

我想也许你想要的是把你的 TreeSet 和使用不同的 Comparator 排序。为此,您必须使用新的 Comparator 创建一个新的 TreeSet,并使用 addAll.

复制旧集合中的条目