Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “当”;“平等”;暗指;订单不';不要紧;?_Java_Sorting_Comparator_Transitivity - Fatal编程技术网

Java “当”;“平等”;暗指;订单不';不要紧;?

Java “当”;“平等”;暗指;订单不';不要紧;?,java,sorting,comparator,transitivity,Java,Sorting,Comparator,Transitivity,我有一组序列化为文件的项。某些项目可以依赖于其他项目,但不允许循环引用。因此,它们需要以这样的方式序列化:如果a依赖于B,B首先在文件中序列化 我编写了我的比较器,它使用reliesOn()函数来确定两个项目是否链接: Collections.sort(itemsToSort, new Comparator<Item>() { @Override public int compare(Item first, Item second) { boolean

我有一组序列化为文件的项。某些项目可以依赖于其他项目,但不允许循环引用。因此,它们需要以这样的方式序列化:如果
a
依赖于
B
B
首先在文件中序列化

我编写了我的
比较器
,它使用
reliesOn()
函数来确定两个项目是否链接:

Collections.sort(itemsToSort, new Comparator<Item>() {
    @Override
    public int compare(Item first, Item second) {
        boolean firstReliesOnSecond = reliesOn(first, second);
        if (firstReliesOnSecond) {
            return 1;
        }
        boolean secondReliesOnFirst = reliesOn(second, first);
        if (secondReliesOnFirst) {
            return -1;
        }
        return 0;
    }
});
那么一种可能的订购方式是:

E, B, A, C, D
至少,
E
B
之前,而
B
A
之前

但是,在比较阶段(以释义为例),发生的情况是将
C
E
进行比较,返回
0
,因为它们没有关系。然后将
C
B
进行比较,并返回
0

因此,排序算法假定
B=E
,但事实并非如此。(即使我打破了
比较器
契约
),我如何才能以确保可传递性的方式编写
compare()
方法

编辑:有人指出我正在对有向无环图执行拓扑排序。我正在回想我的数据结构课程。幸运的是,维基百科似乎有一个很好的线性时间算法来执行这种排序——我来试一试

如何以确保可传递性的方式编写compare()方法

正如您所发现的那样,
比较器的契约迫使您基于两个给定对象做出决策,而它们在整体排序中的关系可能涉及其他对象


这里有一个DAG,你要做的是拓扑排序。我认为使用
比较器
唯一可行的方法是首先进行拓扑排序,然后在实现比较器时将排序中的对象索引用作键。但是,当然也不需要比较器,因为您已经对元素进行了排序。

打破比较器的契约对您没有什么帮助,因为标准排序算法假定您遵守它


除了从Wikipedia实现拓扑排序算法外,您还可以看看lib(当有人谈到有向图和拓扑排序时经常提到lib)或实现。

BTW,假设B=E的不是
Comparator
,而是排序算法。(
Comparator
本身包含的代码很少)你说得对-我想这是排序算法和
Comparator
应该履行的契约的组合。我会更新我的措辞,谢谢!您可以访问
项的相关对象吗?有类似于
getParents()
之类的吗?不能使用排序。你必须穿过森林才能得到所有的树叶first@aioobe所以,投票以复制的形式结束?谢谢你-你把我带到了正确的地方。(在时间限制到期时将标记为已回答。)您可以访问每个
项的“父项”吗?
?是的,我们有一个访问者/实用程序方法可以找到它们。然后可以通过检查对象1是否位于从对象2到根的路径上(反之亦然)来解决此问题。但1)它只是拓扑排序的一个复杂且次优的实现,2)您需要一种方法来解析同级排序
E, B, A, C, D