我正在尝试制作一个解决最小生成树问题的程序。为此,我有一个Edge对象的优先级队列,应该根据它们相应的权重字段进行排序(之后它并不重要,但我一直按节点名称进行排序)。
我正在使用java.util.PriorityQueue
。我已经尝试了所有的东西,但我无法想到实现compareTo()
函数的工作原理。它正确地对大部分边缘进行排序,但不是全部。这是我能想到的最基本的compareTo()
函数的代码:
@Override
public int compareTo(Object other) {
return toString().compareTo(((Edge) other).toString());
}
toString()
函数首先输出权重,然后输出两个节点,所以如果两个节点A和B连接权重4,它将输出
4AB
在放入示例图表后,我最终得到以下优先级队列:
[1AB, 1BA, 1FH, 2CB, 1CG, 1GC, 1HF, 2EB, 2CD, 3EG, 2BC, 2BE, 3AC, 2GH, 2HG, 5AD, 5EC, 3ED, 2EF, 5CE, 4FD, 2FE, 4FG, 5DA, 2DC, 3GE, 4GF, 3DE, 3CA, 4DF]
显然这不是有序的,但基本上每种比较的方法我都能想到产生这个结果。
答案 0 :(得分:0)
这里没有错。您打印的内容似乎是toString()
的结果,但不保证按任何特定顺序排列。{1}}
但是,当您通过移除或查看头部来消耗队列时,将产生由比较器定义的最小元素。整个队列没有排序;该命令仅确定队列的 head ,并且只有指定在头部上操作的某些操作才会受到订单的影响。 toString()
和iterator()
方法不在这些操作中。
您的比较器应该以数字方式比较权重,而不是字符串。使用边缘的字符串比较作为具有相同权重的边缘的打破平衡器是可以的,但考虑是否有两个方向相反的边缘,以及是否需要特别小心。