[英]PriorityQueue returning incorrect ordering for custom comparator?
我將優先級(從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的請求。如果有什么想法不正確或我的比較器錯了?
您的比較器只查看正常工作的第一個數字。 由於您沒有在比較器中進行任何進一步的操作,因此您可以獲得優先級隊列中任何第一個數字相等的排序。
在比較器中還需要2個案例,在前兩個檢查之后,比較值的其余部分,如果第一個值小於或大於第二個值,則返回正確的值。
您只需要更改此比較器:
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));
}
}
如果優先級相同,則使用自然順序進行比較。
一切正常。 您的隊列按順序提供優先級為3,2和1的項目。內部相同的優先級項目未排序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.