自定义类实现comparator
时间: 2023-09-02 21:11:56 浏览: 49
要自定义一个 `Comparator`,需要实现它的 `compare` 方法。该方法接收两个参数,分别代表要比较的两个对象,方法返回一个整数值,表示两个对象的大小关系。
例如,假设有一个 `Person` 类,包含 `name` 和 `age` 两个属性,我们要按照年龄从小到大排序,可以这样实现一个 `Comparator`:
```java
class AgeComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return p1.getAge() - p2.getAge();
}
}
```
在 `compare` 方法中,我们比较两个 `Person` 对象的年龄大小,返回值为正数表示第一个对象的年龄大于第二个对象,返回值为负数表示第一个对象的年龄小于第二个对象,返回值为 0 表示两个对象的年龄相等。
使用时,可以将该 `Comparator` 对象传递给 `Collections.sort` 方法进行排序:
```java
List<Person> people = new ArrayList<>();
// 添加若干 Person 对象到 people 列表中
Collections.sort(people, new AgeComparator());
```
这样就可以按照年龄从小到大排序了。
相关问题
自定义Comparator类
Java中的Comparator接口允许开发人员自定义排序。可以使用Comparator接口来排序各种类型的对象,只需实现compare()方法即可。compare()方法接受两个参数,并返回一个整数,用于指示第一个参数是否小于,等于或大于第二个参数。如果第一个参数小于第二个参数,则返回负数,如果两个参数相等,则返回0,否则返回正数。例如,可以使用自定义Comparator来按学生姓名排序。
```java
import java.util.Comparator;
public class StudentComparator implements Comparator<Student> {
public int compare(Student s1, Student s2) {
return s1.getName().compareTo(s2.getName());
}
}
```
然后使用Collections.sort(list, new StudentComparator());对list进行排序。
利用自定义比较器 Comparator 实现类重新实现上道题
好的,让我们来重新实现上一道题目,利用自定义比较器 Comparator 来实现。以下是代码示例:
```java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int k = scanner.nextInt();
int[] nums = new int[n];
for (int i = 0; i < n; i++) {
nums[i] = scanner.nextInt();
}
PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1);
}
});
for (int i = 0; i < n; i++) {
pq.offer(nums[i]);
if (pq.size() > k) {
pq.poll();
}
}
System.out.println(pq.peek());
}
}
```
在这个代码中,我们创建了一个 PriorityQueue 对象,同时传入了一个自定义的比较器 Comparator。这个比较器的 compare 方法会将两个整数进行比较,返回它们的大小关系。这里我们使用 o2.compareTo(o1) 实现降序排序。
接着,我们遍历整个数组,将每个数加入到 PriorityQueue 中,并在队列大小超过 k 时,将队首元素弹出。最后输出队列中的队首元素即为第 k 大的数。