面试题答案
一键面试- 实现
Comparable
接口- 让
MyClass
类实现java.lang.Comparable
接口,并重写compareTo
方法来定义排序规则。 - 示例代码如下:
- 让
import java.util.PriorityBlockingQueue;
class MyClass implements Comparable<MyClass>{
private int value;
public MyClass(int value) {
this.value = value;
}
public int getValue() {
return value;
}
@Override
public int compareTo(MyClass other) {
// 按照value从小到大排序
return Integer.compare(this.value, other.value);
}
}
public class PriorityQueueExample {
public static void main(String[] args) {
PriorityBlockingQueue<MyClass> queue = new PriorityBlockingQueue<>();
queue.add(new MyClass(3));
queue.add(new MyClass(1));
queue.add(new MyClass(2));
while (!queue.isEmpty()) {
System.out.println(queue.poll().getValue());
}
}
}
- 使用
Comparator
- 也可以不修改
MyClass
类,而是在创建PriorityBlockingQueue
时传入一个Comparator
对象来定义排序规则。 - 示例代码如下:
- 也可以不修改
import java.util.Comparator;
import java.util.PriorityBlockingQueue;
class MyClass {
private int value;
public MyClass(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
public class PriorityQueueExampleWithComparator {
public static void main(String[] args) {
PriorityBlockingQueue<MyClass> queue = new PriorityBlockingQueue<>(
new Comparator<MyClass>() {
@Override
public int compare(MyClass o1, MyClass o2) {
// 按照value从大到小排序
return Integer.compare(o2.getValue(), o1.getValue());
}
}
);
queue.add(new MyClass(3));
queue.add(new MyClass(1));
queue.add(new MyClass(2));
while (!queue.isEmpty()) {
System.out.println(queue.poll().getValue());
}
}
}
通过以上两种方式,都可以实现将MyClass
对象放入PriorityBlockingQueue
中并按照特定规则排序。使用Comparable
接口是在类内部定义比较逻辑,而使用Comparator
是在外部定义比较逻辑,灵活性更高,尤其适用于无法修改类源代码的情况。