当前位置: 首页 > 知识库问答 >
问题:

Java实现PriorityQueue-当没有提供比较器时

谷光誉
2023-03-14

我正在尝试用Java实现我自己的通用PriorityQueue版本(使用二进制堆)。我已经选择使用对象数组作为我的堆。

Object[] qArray = new Object[initial_Size];

如果一个用户提供了一个比较器--这个实现非常简单,因为我可以在进行元素比较时使用比较器的compare方法。

Comparator<T> comparator; //Set to a user-provided comparator in my constructor.

if(comparator.compare((T)qArray[i], (T)qArray[j])
    //do something

然而,当用户没有提供默认比较器时,问题就来了。一种可能的方法是让PriorityQueue类实现比较器,并让比较器执行以下比较-

@Override
public int compare(T o1, T o2)
{
    if(this.comparator == null) //no comparator provided by user
    {
        return o1.toString().compareTo(o2.toString());
    }
    else
    {
        return this.comparator.compare(o1, o2);
    }
}
public class TestClass {

    public class SomeClass
    {
        int value;
        SomeClass(int value)
        {
            this.value = value;
        }
    }

    public static void main(String[] args)
    {
        TestClass tClass = new TestClass();
        TestClass.SomeClass sClass1 = tClass.new SomeClass(10);
        TestClass.SomeClass sClass2 = tClass.new SomeClass(20);

        PriorityQueue<TestClass.SomeClass> pQueue = new PriorityQueue<TestClass.SomeClass>();
        pQueue.add(sClass1);
    }
}

因此,这里的任何实现思路--其中,如果在提供的对象类型(如整数或字符串)上定义了自然排序比较器,则默认情况下应该使用该比较器。

共有1个答案

华峰
2023-03-14

这个异常揭示了一切:如果不提供comparator,Java会尝试将给定对象强制转换为comparabile

不能只将任意类型的对象与泛型算法进行比较。这就是为什么您必须提供比较器或者确保您的对象支持compareTo方法并实现comparable

 类似资料:
  • 我试图解决以下leetcode问题: 给定一个排序数组,两个整数k和x,查找数组中与x最近的k个元素。结果也应该按升序排序。如果有一个领带,较小的元素总是首选。 示例1:输入:[1,2,3,4,5],k=4,x=3 产出:[1,2,3,4] 示例2:输入:[1,2,3,4,5],k=4,x=-1 产出:[1,2,3,4] 目前我的错误解决方案如下: 问题在于我传递给构造函数的比较器。其思想是,我希

  • 在我的PriorityQueue中,我有两种类型的客户,即VIP和常规客户。我想先为贵宾服务,再为常客服务。 如果CustomerID<100,则视为VIP。 如果客户是VIP,他会排在队列中VIP部分的最后 更新:我不想排序任何其他列除了VIP。我不想添加“日期”,因为它感觉像是一个黑客,而不是理解Java是如何工作的。

  • 我正在尝试编写一个使用最小优先级队列的算法,所以我在谷歌上四处查看并找到了PriorityQueue。不过,似乎为了使用它,我需要告诉它我希望它如何排列优先级,并且这样做的方法是使用比较器(我想比较我的“Node1”对象的特定数据字段)。更多的谷歌搜索提出了创建一个新的比较器的想法,它实现了比较器但覆盖了比较方法。我正在尝试的是这样(以及它的其他变体): 编译器有几个理由提出抗议,其中之一是我没有

  • 我正在将边添加到PriorityQueue,但由于某些原因,它们没有按其值进行排序,从而导致以后出现错误的结果。 我的边缘班是这样的 然而,当我运行我的代码,在属于节点“Springfield,MO”的LinkedList中将所有内容添加到PriorityQueue时,边按错误的顺序排序,如下图所示,问题是什么? 我尝试为Edge创建一个特定的比较器类,并将其用作PriorityQueue中的参数

  • 我在理解和使用比较器方面有一个问题,有人问我以下问题: 我在一个单独的Employee类中使用compareTo比较器接口来调用比较器对象的重载使用。 任何帮助,建议,代码行将非常感谢!!

  • 我知道这些接口用于对集合中的对象进行排序。但我怀疑这两者的真正区别。我读到的一个事实是,如果要比较两个对象而不使用当前对象,请使用Compariable(此)。 但我的问题是即使使用比较器,我们也会比较相同的对象类型。 这里真正的区别是什么。我很困惑。假设下面的例子, 如果我使用比较器,我会让一个类实现比较器,而不是这个。年龄,它有人。年龄那么这里有什么不同呢? 我不知道Collections.s