我如何让一个PriorityQueue对我想要它排序的东西进行排序?
另外,在提供和添加方法之间有区别吗?
我如何让一个PriorityQueue对我想要它排序的东西进行排序?
另外,在提供和添加方法之间有区别吗?
当前回答
我还想知道打印订单的问题。举个例子:
对于优先级队列:
PriorityQueue<String> pq3 = new PriorityQueue<String>();
这段代码:
pq3.offer("a");
pq3.offer("A");
可能打印不同于:
String[] sa = {"a", "A"};
for(String s : sa)
pq3.offer(s);
我从另一个论坛的讨论中找到了答案,其中一个用户说,“offer()/add()方法只将元素插入队列。如果你想要一个可预测的顺序,你应该使用peek/poll来返回队列的头。”
其他回答
在这里,我们可以定义用户定义的比较器:
以下代码:
import java.util.*;
import java.util.Collections;
import java.util.Comparator;
class Checker implements Comparator<String>
{
public int compare(String str1, String str2)
{
if (str1.length() < str2.length()) return -1;
else return 1;
}
}
class Main
{
public static void main(String args[])
{
PriorityQueue<String> queue=new PriorityQueue<String>(5, new Checker());
queue.add("india");
queue.add("bangladesh");
queue.add("pakistan");
while (queue.size() != 0)
{
System.out.printf("%s\n",queue.remove());
}
}
}
输出: 印度 巴基斯坦 孟加拉国
提供和添加方法的区别:链接
没有区别,正如在javadoc中声明的那样:
public boolean add(E e) {
return offer(e);
}
只需将适当的Comparator传递给构造函数:
PriorityQueue(int initialCapacity, Comparator<? super E> comparator)
offer和add之间的唯一区别是它们所属的接口。offer属于Queue<E>接口,而add最初出现在Collection<E>接口。除此之外,这两种方法做的事情完全相同——将指定的元素插入优先级队列。
我还想知道打印订单的问题。举个例子:
对于优先级队列:
PriorityQueue<String> pq3 = new PriorityQueue<String>();
这段代码:
pq3.offer("a");
pq3.offer("A");
可能打印不同于:
String[] sa = {"a", "A"};
for(String s : sa)
pq3.offer(s);
我从另一个论坛的讨论中找到了答案,其中一个用户说,“offer()/add()方法只将元素插入队列。如果你想要一个可预测的顺序,你应该使用peek/poll来返回队列的头。”
作为使用Comparator的替代方法,您还可以让您在PriorityQueue中使用的类实现Comparable(并相应地重写compareTo方法)。
注意,如果排序是对象的直观排序,那么通常最好只使用Comparable而不是Comparator——例如,如果您有一个用例要按年龄对Person对象排序,那么可能最好只使用Comparator。
import java.lang.Comparable;
import java.util.PriorityQueue;
class Test
{
public static void main(String[] args)
{
PriorityQueue<MyClass> queue = new PriorityQueue<MyClass>();
queue.add(new MyClass(2, "short"));
queue.add(new MyClass(2, "very long indeed"));
queue.add(new MyClass(1, "medium"));
queue.add(new MyClass(1, "very long indeed"));
queue.add(new MyClass(2, "medium"));
queue.add(new MyClass(1, "short"));
while (queue.size() != 0)
System.out.println(queue.remove());
}
}
class MyClass implements Comparable<MyClass>
{
int sortFirst;
String sortByLength;
public MyClass(int sortFirst, String sortByLength)
{
this.sortFirst = sortFirst;
this.sortByLength = sortByLength;
}
@Override
public int compareTo(MyClass other)
{
if (sortFirst != other.sortFirst)
return Integer.compare(sortFirst, other.sortFirst);
else
return Integer.compare(sortByLength.length(), other.sortByLength.length());
}
public String toString()
{
return sortFirst + ", " + sortByLength;
}
}
输出:
1, short
1, medium
1, very long indeed
2, short
2, medium
2, very long indeed