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

Java PriorityQueue Comparator-如何/何时排序?

司空健
2023-03-14

我正在初始化一个优先级队列,如下所示:

strategy = new FuelPriority();
incoming = new PriorityQueue<Vehicle>(1, strategy);

我的比较器类的代码是:

public class FuelPriority implements Comparator<Object> {

public int compare(Object o1, Object o2) {

    Vehicle a1 = (Vehicle) o1;
    Vehicle a2 = (Vheicle) o2;

    return Integer.compare(a1.getFuelLevel(), a2.getFuelLevel());
  }
}

运行模拟后,元素根本没有排序——它们是随机的;我在我的FuelPriority类的compare方法中设置了一个断点,但它根本没有被调用。我错过什么了吗?

共有2个答案

田修为
2023-03-14

API表示,PriorityQueue迭代器不能保证以任何特定顺序遍历优先级队列的元素。只能保证轮询、删除、查看和元素访问队列头部的元素(最少的元素)

颜黎昕
2023-03-14

除了你代码上的错别字,它对我有用。

import java.util.Comparator;
import java.util.PriorityQueue;

public class StackOverflow
{
    public static void main(String[] args)
    {

        FuelPriority strategy = new FuelPriority();
        PriorityQueue<Vehicle> incoming = new PriorityQueue<Vehicle>(4, strategy);
        incoming.add(new Vehicle("car1", 10));
        incoming.add(new Vehicle("car2", 20));
        incoming.add(new Vehicle("car3", 15));
        incoming.add(new Vehicle("car4", 1));

        // to retrieve the elements in order
        while (!incoming.isEmpty()) {
            System.out.println(incoming.poll());
        }

    }

}

class FuelPriority
    implements Comparator<Object>
{

    public int compare(Object o1, Object o2)
    {

        Vehicle a1 = (Vehicle)o1;
        Vehicle a2 = (Vehicle)o2;

        return Integer.compare(a1.getFuelLevel(), a2.getFuelLevel());
    }
}

class Vehicle
{

    private String name;
    private int fuelLevel;

    public Vehicle(String name, int fuelLevel)
    {
        this.name = name;
        this.fuelLevel = fuelLevel;
    }
    public int getFuelLevel()
    {
        return fuelLevel;
    }

    @Override
    public String toString()
    {
        return name + "=" + fuelLevel;
    }
}
 类似资料:
  • 问题内容: 我正在尝试按其类型为time.Time的成员在Go中对结构进行排序。结构如下。 我具有以下用于排序的功能 映射定义如下 在地图填充值之后,按值对地图进行排序如下 问题是结果没有排序,谁能告诉我问题是什么。 问题答案: 在我看来,它看起来像是: 输出:

  • 问题链接1链接2链接3 从上面的链接,我希望我遵循的答案是被接受的。但我还是有例外。我正在使用Java 6。 代码: 堆栈跟踪:

  • 问题内容: 我想排序CopyOnWriteArrayList。但是当我尝试运行以下代码时 它在扔unsorted operation exception。 提前致谢。 问题答案: 但是CopyOnWriteArrayList的ListIterator不支持remove,set或add方法。 解决方法:

  • 问题内容: 因此,我的时间戳如下所示: 我将它们放在DataFrame中,并且尝试按升序对其进行排序。我尝试了以下方法。但是,它似乎不起作用 任何帮助表示赞赏。 问题答案: 您只需要确保正确表示格式规范,就可以将其转换为之前的 实际 日期时间。 这比分解组件中的时间戳并按照您的尝试执行多准则排序要直接得多。 演示版

  • 本文向大家介绍MongoDB中如何按时间戳(降序)排序,包括了MongoDB中如何按时间戳(降序)排序的使用技巧和注意事项,需要的朋友参考一下 要按时间戳排序,请在MongoDB中使用sort()。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是按时间戳排序的查询(降序)- 这将产生以下输出-

  • 问题内容: 我编写了以下Python代码: 现在我明白了: 它以哪种方式订购? 它可能会帮助您获得我的ls -l输出: 它不是按文件名或大小排序的。 相关链接:, 问题答案: 它可能根本没有排序,而是使用条目在文件系统中出现的顺序,即使用时获得的顺序。(至少在我的机器上,这产生与列表匹配相同的顺序)。