簡體   English   中英

PriorityQueue返回自定義比較器的錯誤排序?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM