【问题标题】:push in priorityqueue推入优先队列
【发布时间】:2010-06-20 09:51:21
【问题描述】:

我想将一些 int 推送到优先队列,但我不能!我使用了 queue.add() 代码,但此代码将返回排序后的队列,请帮助,谢谢!

【问题讨论】:

  • 澄清您对add 的问题是什么,以及push(如果存在)会如何表现不同。
  • 在发布真正含糊的问题方面,这是您可以做到的最大程度吗?如果您不能使用标准库代码(无论是哪个标准),请尝试实施;堆是数据结构的常用选择。

标签: java collections queue priority-queue


【解决方案1】:

push/pop 操作明确定义为堆栈抽象数据类型;我不确定这对于队列(甚至优先级队列)是否有意义。

PriorityQueueimplementsQueue,仅指定add/remove。另一方面,DequeaddFirst/LastremoveFirst/Last 等。也许其中一个就是您要寻找的。​​p>


一个例子

这是一个使用 StringPriorityQueue 的示例,使用自定义的 Comparator 比较长度。

    Queue<String> queue = new PriorityQueue<String>(
        100, new Comparator<String>() {
            @Override public int compare(String s1, String s2) {
                return Integer.valueOf(s1.length()).compareTo(s2.length());
            }
        }
    );
    queue.add("Sally");
    queue.add("Amy");
    queue.add("Alice");

    System.out.println(queue);
    // "[Amy, Sally, Alice]"

    System.out.println(queue.remove());
    // "Amy"

    System.out.println(queue.remove());
    // "Alice"

    queue.add("Tina");
    System.out.println(queue.remove());
    // "Tina"

正如预期的那样,PriorityQueue 将在remove 之后给出队列中最短的String。同样如指定的那样,平局是任意打破的。

相关问题

开启PriorityQueue

开启ComparatorComparable

【讨论】:

    【解决方案2】:

    优先级队列的重点在于它首先返回最小的条目(或者更确切地说,是出现在排序列表中的第一个元素)。如果这不是你想要的,你可能不想要一个直接的 PriorityQueue。

    你可以做的是创建一个类,它有一个 PriorityQueue 用于通常的东西,还有一个堆栈用于“紧急情况”。有一个将东西添加到堆栈的 push(T) 方法,以及一个添加到队列的 add(T) 方法。无论哪种方法获取下一个元素,如果堆栈中有任何内容,都应该将其从堆栈中删除,否则它会获取队列的下一个元素。

    【讨论】:

      【解决方案3】:

      我想将一些 int 推送到 优先队列

      'Push' 是堆栈操作,不是队列操作。

      但我不能!我用过 queue.add() 代码,但此代码将 返回排序后的队列

      不,不会的。 PriorityQueue 仅出于移除队列头部的目的进行排序。

      你的问题没有多大意义。如果要推送,请使用堆栈。如果您不想要 PriorityQueue 的功能,请不要使用它。

      您的实际问题究竟是什么?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-20
        • 2010-12-28
        • 2012-03-28
        相关资源
        最近更新 更多