MST

星途 面试题库

面试题:Java中PriorityBlockingQueue如何自定义元素优先级

在Java的PriorityBlockingQueue中,假设我们有一个自定义类MyClass,要将其对象放入PriorityBlockingQueue中并按照特定规则排序,请描述如何实现自定义的优先级策略,可结合代码示例说明。
30.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 实现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());
        }
    }
}
  1. 使用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是在外部定义比较逻辑,灵活性更高,尤其适用于无法修改类源代码的情况。