我的理解是,我不需要使用任何方法对PriorityQueue
进行排序,而只是向其中添加项目并获取项目会使它们按自然顺序排列。
队列
public class JobSetQueue extends PriorityBlockingQueue<JobSet> {
public JobSetQueue() {
super(1, new JobSetComparator());
}
}
比较
我已经通过调试器来验证下面的getValue()方法是否返回了具有最高优先级的预期值,并返回了Comparator期望的正确值。我错了吗? 为了让comprator影响PriorityQueue订单,我需要做些什么吗?
public class JobSetComparator implements Comparator<JobSet> {
@Override
public int compare(JobSet o1, JobSet o2) {
return Integer.compare(o1.getHighestPriority().getValue(), o2.getHighestPriority().getValue());
}
}
优先级
public class Priority {
public static final Priority TOP = new Priority("TOP", 1000);
public static final Priority PRIORITY_REMAN = new Priority("PRIORITY_REMAN", 750);
public static final Priority PRIORITY = new Priority("PRIORITY", 500);
public static final Priority STANDARD_REMAN = new Priority("STANDARD_REMAN", 250);
public static final Priority STANDARD = new Priority("STANDARD", 100);
private final String name;
private final int value;
protected Priority(String name, int value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public int getValue() {
return value;
}
public String toString() {
return getName();
}
}
我的测试:
@Before
public void setUp() {
queue = new JobSetQueue();
queue.add(new JobSet(new JobUnit(new Product(new ProductEntity(), Priority.STANDARD), 1)));
queue.add(new JobSet(new JobUnit(new Product(new ProductEntity(), Priority.PRIORITY_REMAN), 1)));
queue.add(new JobSet(new JobUnit(new Product(new ProductEntity(), Priority.PRIORITY), 1)));
}
@Test
public void testTop() {
queue.add(new JobSet(new JobUnit(new Product(new ProductEntity(), Priority.TOP), 1)));
Assert.assertEquals("Queue priority,", Priority.TOP, queue.poll().getJobUnitList().get(0).getProduct().getPriority());
}
答案 0 :(得分:3)
我怀疑你期望PQ的迭代器按顺序迭代。它没有。见Javadoc。只有在删除时才能观察到PQ的排序。
答案 1 :(得分:0)
首先,我没有在Javadoc中看到Integer.compare,我看到compareTo。
其次,我认为你的比较器是落后的。您希望在较小的优先级之前获得最高优先级:
@Override
public int compare(JobSet o1, JobSet o2) {
return o2.getHighestPriority().getValue() - o1.getHighestPriority().getValue());
}
如果01的优先级更高(例如,如果o1在队列之前小于02),则返回负数。