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



我有我的'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中,我创建了另一个与sorting相对的comparator-

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从旧的集合复制条目。

相关内容

最新更新