我正在寻找一个数据结构的 Java 实现,它包含定义了部分排序的元素集合,并允许以某种拓扑顺序迭代这些元素(任何可能的排序都可以;最好是稳定的随着集合内容的变化进行排序)。
理想情况下,它将实现一个Collection<E>
、Set<E>
或SortedSet<E>
接口并支持该接口上的所有方法。在指定总排序方面,可以用 a 实例化集合,如果要比较的两个元素没有相对于彼此排序,Comparator<E>
比较器可能会抛出异常 ( ?)。ClassCastException
作为奖励,如果插入的元素会产生排序异常(元素有序图中的循环),它将引发异常。
所以是的,我想要的是拓扑排序,但我想要一个集合对象,它在每次插入/删除时都保持该排序顺序,类似于 SortedSet 如何按排序顺序维护集合。
这样的事情存在吗?在一些开源库中?
参考:
http://en.wikipedia.org/wiki/Partially_ordered_set
http://en.wikipedia.org/wiki/Topological_sorting
更新
在意识到我的要求对性能的影响(以及我无法完全解决的各种其他问题,使用 poset)之后,我最终采用了一种不同的方法来解决我不需要 poset 的问题。依靠比较器来确定元素之间的顺序意味着对于元素插入,我必须针对每个现有元素咨询比较器,每次插入的成本为 O(n)。
如果性能不是很重要(确实如此),并且如果元素的数量限制在合理的范围内(不是),我想我会采用 Willie 建议的方法,尽管可能使用我自己的图形实现和拓扑排序实现以最小化依赖关系。