Java部分订购了Collection <e> </e>

时间:2012-09-11 04:35:29

标签: java collections set abstract-data-type poset

我正在寻找一个数据结构的Java实现,它包含一个元素集合,其中定义了部分排序,并允许在某些拓扑中迭代这些元素订单(任何可能的订单都很好;最好是一个稳定的订单,因为收集的内容会发生变化)。

理想情况下,它会实现Collection<E>Set<E>SortedSet<E>接口,并支持接口上的所有方法。在指定总排序方面,可以使用Comparator<E>来实例化集合,并且如果被比较的两个元素相对于彼此没有排序,则比较器可以抛出异常(ClassCastException?)。作为奖励,如果插入的元素会产生排序异常(元素的有序图中的循环),它将抛出异常。

所以是的,我想要的是一个拓扑排序,但是我想要一个集合对象,它在每次插入/删除时保持排序顺序,类似于SortedSet如何按排序顺序维护集合。

这样的事情存在吗?在一些开源库中?

参考文献:

http://en.wikipedia.org/wiki/Partially_ordered_set

http://en.wikipedia.org/wiki/Topological_sorting

更新

在我意识到我的要求的性能影响(以及我无法解决的各种其他问题,使用poset)后,我最终采用了不同的方法解决了我的问题,我不需要一个poset。依靠比较器确定元素之间的顺序意味着对于元素插入,我必须针对每个现有元素查询比较器,每次插入花费O(n)。

如果表现不是很重要(确实如此),如果元素的数量被限制在合理的范围内(事实并非如此),我想我会采用Willie建议的方法,尽管可能有我自己的图表实现和拓扑排序实现,以最大限度地减少依赖。

1 个答案:

答案 0 :(得分:3)

有向无环图是否足以满足您的需求?我知道这一般不会捕获posets,但你提到想要排除图循环。

如果是这样,你可以看一下JGraphT:http://jgrapht.org/

有拓扑排序的图形迭代器。

请注意,有向图不是java.util.Collections,但您可以获取顶点,它们是java.util.Set。如果您需要将数据结构本身作为集合,则可以使用 集合的瘦包装器包装JGraphT有向图,将顶点视为元素。

这里潜在的缺点是你必须明确地创建边缘,这可能是你的应用程序可以接受的,也可能是不可接受的。

相关问题