PriorityQueue返回自定义比较器的错误排序?

时间:2011-12-09 12:54:05

标签: java

我将优先级(从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的请求 如果某些事情不正确或者我的比较器是错误的吗?

3 个答案:

答案 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的项目。内部相同的优先级项目未排序。