当前位置: 首页 > 知识库问答 >
问题:

Java PriorityQueue:如何使用自定义比较器对集合进行堆化?

闻人业
2023-03-14
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());
for (Integer i : list) {
    maxHeap.offer(i);
}
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(list);

引用:PriorityQueue的Java文档

ps:@user207421
Heapify算法可以在O(n)时间内将任何未排序的数组转换为堆,而不是O(nlogn)。有很多关于Heapify的文章。堆也不是排序数组。它是一个具有堆属性的完整树,可以用数组进行编码。

共有1个答案

伏欣悦
2023-03-14

根据PriorityQueue(PriorityQueue)的java文档

创建包含指定优先级队列中的元素的PriorityQueue。此优先级队列将按照与给定优先级队列相同的顺序进行排序。

因此,我们可以将PriorityQueue扩展为CustomComparatorPriorityQueue,以保存所需的比较器和需要heapify的集合。然后使用CustomComparatorPriorityQueue实例调用新的PriorityQueue(PriorityQueue)

import java.util.*;

public class CustomComparatorPriorityQueue<T> extends PriorityQueue<T> {
    private Collection<T> wrapped;

    public static <U> PriorityQueue<U> create(Collection<U> wrapped, Comparator<U> custom) {
        return new PriorityQueue<U>(new CustomComparatorPriorityQueue<>(wrapped, custom));
    }

    private CustomComparatorPriorityQueue(Collection<T> wrapped, Comparator<T> custom) {
        super(custom);
        this.wrapped = wrapped;
    }

    @Override
    public Object[] toArray() {
        return wrapped.toArray();
    }

    public static void main(String[] args) {
        List<Integer> a = Arrays.asList(3, 6, 4, 8, 1, 9);
        PriorityQueue<Integer> pq = CustomComparatorPriorityQueue.create(a, Comparator.<Integer>naturalOrder().reversed());
        Integer b;
        while ((b = pq.poll()) != null) {
            System.out.println(b);
        }
    }

    // Override to don't allow other purpose...
}

 类似资料:
  • 问题内容: 我需要使用自定义比较器对整数数组进行排序,但是Java的库没有为带有比较器的整数提供排序功能(比较器只能与对象一起使用)。有没有简单的方法可以做到这一点? 问题答案: 如果你无法更改输入数组的类型,则将执行以下操作: 这可以使用ArrayUtilscommons-lang项目轻松地在和之间进行转换,创建数组的副本,进行排序,然后将排序后的数据复制到原始数据上。

  • 我有一个用类填充的树集。我想让这些按其继承排序,否则,只按其名称的字母顺序(以创建一个恒定的顺序)。但是由于某种原因,如果添加的类的顺序不正确,就会导致类的顺序不正确。 这是我的比较器: 下面是一个测试失败的例子: 排序集的实际值: 我的期望更像是: 我在调试时确实注意到,并非每个项目都相互比较。

  • 我有以下清单: 这是我的比较器函数: 我正在尝试使用它排序如下: 我不明白为什么第一个NaN不在列表的末尾。 我对升序排序列表的预期输出是: 我对降序排序列表的预期输出是: 在升序排序和降序排序的情况下,我希望NaNs在最后。 我知道sortwith使我们能够编写自己的比较器。有人能帮我吗?

  • 问题内容: 我想为汽车清单开发一个排序演示。我正在使用数据表显示汽车列表。现在实际上我想按汽车颜色对列表进行排序。这里不是按字母顺序排序的。我想使用我的自定义排序顺序,例如先是红色汽车,然后是蓝色,等等。 为此,我尝试使用,但它只允许按字母顺序排序。 因此,任何人都可以指导我实现使用该技术的方法,以便使排序变得更快。 问题答案: 我建议你为汽车颜色创建一个枚举,而不要使用字符串,并且枚举的自然顺序

  • 问题内容: 我知道有几个这样的问题,但是它们似乎对我没有用。 我有一个列表,5元素乘以50。我想通过对每个元素应用自定义比较功能来对列表进行排序。此函数计算要对元素进行排序的列表的适用性。我创建了两个函数,比较和适应性: 和 然后我尝试通过以下方式致电给他们: 要么 要么 要么 我也尝试了具有相同参数的list.sort()。但是无论如何,函数都不会将列表作为参数,而是作为参数。我不知道为什么,这

  • 如何使用Comparator对对象的ArrayList进行正确排序,然后将排序后的数组传递给自定义数组适配器? 我试过这样做: ArrayList的内容类: 比较器: 在OnCreate中设置适配器: ...因为我使用的是定制的ArrayAdapter,就像: 我需要如何修改此适配器以使其与其他适配器一起工作? 谢谢你的帮助。