了解PriorityQueue比较器

问题描述 投票:0回答:1

[学习一些DP并遇到PQ用作某些问题的堆,但是,在我的脑海中,越来越难知道比较器的投篮手lamda;

例如:

class Interval {
  int start = 0;
  int end = 0;

  Interval(int start, int end) {
    this.start = start;
    this.end = end;
  }
}

PriorityQueue<Integer> maxStartHeap = new PriorityQueue<>(n, (i1, i2) -> intervals[i2].start - intervals[i1].start);
PriorityQueue<Integer> maxEndHeap = new PriorityQueue<>(n, (i1, i2) -> intervals[i2].end - intervals[i1].end);

一个int减去另一个int如何创建所需的最小或最大的第一顺序?我想尝试可能的实现,但不知道从哪里开始。有人可以指出我可以解释确切情况的资源的情况吗,如果比较器的外观基于最大负数,则它是比较器的外观,这是头等大事,但这仅是猜测。

java comparator priority-queue
1个回答
0
投票

类似于此:

new PriorityQueue<>(n, new Comparator<Integer>() {
    public int compare(Integer one, Integer two) {
        return intervals[one] - intervals[two];
    }
});

就是说,您可能不希望基于外部数组对比较器进行排序。我会发布更多您的代码(例如,您如何使用intervals)。在这种情况下,Comparator用于对PriorityQueue中的元素进行排序。您可能正在比较Interval对象队列中的间隔:

class Interval {

    //...

    public int difference() {
        return this.end - this.start;
    }        
}

PriorityQueue<Interval> values = new PriorityQueue((i1, i2) -> Integer.compare(i1.difference(), i2.difference()));
//AKA
PriorityQueue<Interval> values = new PriorityQueue(Comparator.comparingInt(Interval::difference)));

这将基于values的各个值对Interval#difference进行排序。如果您在Java 8上仍然落后一些,我将进一步研究函数api和方法引用。

© www.soinside.com 2019 - 2024. All rights reserved.