【发布时间】:2022-11-21 05:37:09
【问题描述】:
我对 PriorityQueue 感到困惑,不确定我的用例是否有不同的方法。
我不想比较两个字符串,而是想将传入的字符串与 String[] 进行比较。
它有点工作,但头节点不会移动。
主要的:
public class App
{
public static void main( String[] args )
{
PriorityString priorityString = new PriorityString();
PriorityQueue<String> priorityQueue = new PriorityQueue<String>(priorityString);
priorityQueue.add("test");
priorityQueue.add("john");
priorityQueue.add("blue");
priorityQueue.add("orange");
priorityQueue.add("grape");
priorityQueue.add("handle");
while (!priorityQueue.isEmpty()) {
System.out.println("Removed: " + priorityQueue.remove());
}
}
}
比较类:
public class PriorityString implements Comparator<String> {
String[] valueStrings;
PriorityString() {
valueStrings = new String[] {"all", "john", "door", "floor", "record", "desk", "orange"};
}
public int compare(String o1, String o2) {
if (Arrays.asList(valueStrings).contains(o1))
return 0;
else
return 1;
}
}
结果:
Removed: test
Removed: john
Removed: orange
Removed: blue
Removed: handle
Removed: grape
值“test”始终排在第一位,即使它不在 String[] 中也是如此。 其他值的顺序似乎是正确的,因为“john”和“orange”在 String[] 中,而其余的则不是。
问题是什么,这是实现我的用例的正确方法吗?
编辑:我也试过这个
public int compare(String o1, String o2) {
if (Arrays.asList(valueStrings).contains(o1))
return -1;
else if (Arrays.asList(valueStrings).contains(o2))
return 0;
else
return 1;
}
结果如下:
Removed: orange
Removed: handle
Removed: grape
Removed: test
Removed: blue
Removed: john
橙色在正确的位置 by john 在底部,当它应该在橙色之后
新编辑:根据评论重新阅读文档后,我设法以这种方式实现了一个工作版本。可能会添加@Progman else 返回。
public int compare(String o1, String o2) {
if (Arrays.asList(valueStrings).contains(o1))
return -1;
else if (Arrays.asList(valueStrings).contains(o2))
return 1;
else
return 0;
}
结果:
Removed: orange
Removed: john
Removed: grape
Removed: test
Removed: blue
Removed: handle
【问题讨论】:
-
你的
Comparator坏了,请咨询它的documentation(例如“当第一个参数小于、等于或大于第二个参数时,返回负整数、零或正整数。", "实施者必须确保所有 x 和 y 的 signum(compare(x, y)) == -signum(compare(y, x))“,……)
标签: java priority-queue