我将优先级(从0到3)与用户ID相结合,并使用比较器对优先级队列进行排序。 主要功能和比较器如下
public class PriQueTest {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Comparator<String> comparator = new StringPriComparator();
PriorityQueue<String> queue =
new PriorityQueue<String>(3, comparator);
queue.add("3"+"128763711");
queue.add("2"+"128763712");
queue.add("0"+"128763718");
queue.add("1"+"128763713");
queue.add("3"+"128763714");
queue.add("2"+"128763715");
queue.add("2"+"128763716");
queue.add("3"+"128763717");
while (queue.size() != 0)
{
System.out.println( (queue.remove().substring(1)));
}
}
public static class StringPriComparator implements Comparator<String>
{
@Override
public int compare(String x, String y)
{
if (Integer.parseInt(x.substring(0, 1)) > Integer.parseInt(y.substring(0, 1)))
{
return -1;
}
if (Integer.parseInt(x.substring(0, 1)) < Integer.parseInt(y.substring(0, 1)))
{
return 1;
}
return 0;
}
}
}
优先级的排序是正确的,但同一优先级内的用户排序不正确
上述代码的输出是
128763711
128763714
128763717
128763716
128763712
128763715
128763713
128763718
其中预期输出如下
128763711
128763714
128763717
128763712*
128763715*
128763716*
128763713
128763718
此处ID为128763712的用户在ID为128763716的用户之前发出优先级为2的请求 如果某些事情不正确或者我的比较器是错误的吗?
答案 0 :(得分:3)
您的比较器只查看正常工作的第一个数字。由于你没有在比较器中用剩余的值做任何进一步的事情,你得到优先级队列中任何第一个数字相等的任何排序。
在比较器中还需要2个案例,在前两个检查之后,比较值的其余部分,如果第一个值小于或大于第二个值,则返回正确的值。
答案 1 :(得分:1)
您只需要更改此比较器:
public static class StringPriComparator implements Comparator<String> {
@Override
public int compare(String x, String y) {
if (Integer.parseInt(x.substring(0, 1)) > Integer.parseInt(y.substring(0, 1))) {
return -1;
}
if (Integer.parseInt(x.substring(0, 1)) < Integer.parseInt(y.substring(0, 1))) {
return 1;
}
return x.substring(1).compareTo(y.substring(1));
}
}
如果优先级相同,则使用自然顺序进行比较。
答案 2 :(得分:0)
一切正常。您的队列按顺序提供优先级为3,2和1的项目。内部相同的优先级项目未排序。