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