Java:从优先级队列生成的奇怪队列顺序

Java:从优先级队列生成的奇怪队列顺序,java,priority-queue,Java,Priority Queue,我写了一个迷宫求解程序,该程序应该支持DFS、BFS、a*、Dijkstra和贪婪算法。无论如何,我选择PriorityQueue作为我的frontier数据结构,因为我认为优先级可以表现为队列、堆栈或优先级队列,这取决于比较器的实现 这就是我如何实现比较器以将优先级队列转换为队列: /由于优先级队列的“自然排序”在队列的头部有最少的元素,而传统的比较器在第一个元素小于第二个元素时返回-1,因此被黑客攻击的比较器总是返回1,因此当前(最后一个)方将放在尾部(这应该递归工作)/ public in

我写了一个迷宫求解程序,该程序应该支持DFS、BFS、a*、Dijkstra和贪婪算法。无论如何,我选择PriorityQueue作为我的frontier数据结构,因为我认为优先级可以表现为队列、堆栈或优先级队列,这取决于比较器的实现

这就是我如何实现比较器以将优先级队列转换为队列:

/由于优先级队列的“自然排序”在队列的头部有最少的元素,而传统的比较器在第一个元素小于第二个元素时返回-1,因此被黑客攻击的比较器总是返回1,因此当前(最后一个)方将放在尾部(这应该递归工作)/

public int compare(Square square1, Square square2)
{
    return 1;
}
然而,在我做了BFS之后,我的迷宫解决方案并不是最优的

迷宫从右上角的坐标(35,1)开始,我的程序检查左边,然后向上,然后向下,然后是右边。 以下是我所做的打印:

民调结果(35,1)

增加(34,1)

增加(35,2)

民调结果(34,1)

增加(33,1)

增加(34,2)

民调结果(35,2)

增加(35,3)

民调结果(33,1)

增加(32,1)

增加(33,2)

民调结果(34,2)

加(34,3)

投票结果(32,1)

BFS(35,3)中的通知应在(32,1)之前轮询,因为前者在后者之前添加到队列中。真正让我困惑的是,数据结构的行为就像一个队列——所有新成员都是从后面添加的——直到我添加了(32,1),它被放在队列的最前面

我认为我的比较器应该强制优先级队列将新加入者排在后面。对我来说更奇怪的是,数据结构从中间的队列变为堆栈的性质。

非常感谢前面的各位,很抱歉我的英语很差, 真诚地
Sean

您实现
compare
的方式是错误的,只有在您假设的非常具体的方式调用它时,它才会起作用。但是,您不知道
PriorityQueue
在什么上下文中实际调用
compare
compare
函数可以在数据结构中的现有元素上调用,而不是在新元素上调用,反之亦然

(即使您确实阅读了源代码并对其进行了跟踪,发现此特定实现以某种方式工作,但如果您希望代码可维护,也不应该依赖于此。至少,您需要解释其工作原理,从而使自己的工作更为繁重。)

您可以使用某种计数器并将其指定为每个添加项的值,然后根据该值正确执行
compare

compare
的正确实现可能如下所示:

int compare(Object x, Object y){
    return x.getSomeProperty() - y.getSomeProperty();
}

请注意,如果切换参数的顺序,答案也会改变。不,返回的int不一定来自{-1,0,1}。该规范调用0或负整数或正整数。只要符号正确,您可以使用任何一个符号。

您实现的
compare
方法是错误的,并且只有在以您假设的非常具体的方式调用它时才会起作用。但是,您不知道
PriorityQueue
在什么上下文中实际调用
compare
compare
函数可以在数据结构中的现有元素上调用,而不是在新元素上调用,反之亦然

(即使您确实阅读了源代码并对其进行了跟踪,发现此特定实现以某种方式工作,但如果您希望代码可维护,也不应该依赖于此。至少,您需要解释其工作原理,从而使自己的工作更为繁重。)

您可以使用某种计数器并将其指定为每个添加项的值,然后根据该值正确执行
compare

compare
的正确实现可能如下所示:

int compare(Object x, Object y){
    return x.getSomeProperty() - y.getSomeProperty();
}

请注意,如果切换参数的顺序,答案也会改变。不,返回的int不一定来自{-1,0,1}。该规范调用0或负整数或正整数。只要符号正确,你可以使用任何一个。我的比较器在什么意义上是不正确的?我在Oracle上读到比较器“比较两个参数的顺序。当第一个参数小于、等于或大于第二个参数时,返回一个负整数、零或正整数。”我只是按照描述进行了操作。如果比较两个平方,并且它们不相等,然后,您应该得到求反的值,以便按相反的顺序进行比较-但是比较器是不一致的。假设我给它喂了一个“苹果”和一个“橘子”。我得到的答案是苹果>橘子。我喂它一个“橘子”和一个“苹果”,然后它告诉我橘子>苹果。不一致。你知道我能在哪里读到更多关于这个的信息吗?当我运行A*算法时,我比较了存储在方块中的“累计成本”,它根据比较结果返回-1,0,0r 1。不过,结果似乎是正确的。D:@Sean:只需阅读文档,即可获得
Comparable.compareTo
。例如:“实现者必须确保所有x和y的sgn(x.compareTo(y))==-sgn(y.compareTo(x))。”您的实现显然不是这样。非常感谢您的帮助。我想我现在要排队了我的比较器在什么意义上是不正确的?我在Oracle上读到比较器“比较两个参数的顺序。当第一个参数小于、等于或大于第二个参数时,返回一个负整数、零或正整数。”我只是按照描述进行了操作。如果比较两个平方,并且它们不相等,然后,您应该得到求反的值,以便按相反的顺序进行比较-但是比较器是不一致的。比方说,我给它喂了一个“苹果”和一个苹果