当前位置: 首页 > 面试题库 >

Java部分订购的集合

柴泰平
2023-03-14
问题内容

我正在寻找一种数据结构的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

更新资料

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

如果性能不是很重要(是),并且元素的数量限制在合理范围内(不是),我想我会采用Willie建议的方法,尽管也许是我自己的图形实现和拓扑排序实现以最小化依赖关系。


问题答案:

有向无环图是否足以满足您的需求?我知道这通常不能捕获位姿,但是您提到要排除图周期。

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

有一个用于拓扑排序的图迭代器。

请注意,有向图不是java.util.Collections,但是您可以获取顶点,它们是java.util.Set。如果你需要的数据结构本身是一个集合,你也许可以换一个JGraphT向图用薄的包装,
一个收集,处理顶点的元素。

这里的潜在缺点是必须显式创建边缘,这对于您的应用程序可能是可接受的,也可能是不可接受的。



 类似资料:
  • 问题内容: 在Java中,是否有一个对象的作用类似于用于存储和访问键/值对的Map,但是可以返回键的有序列表和值的有序列表,从而使键和值列表的顺序相同? 因此,按照代码进行解释,我正在寻找某种行为,就像我的虚拟OrderedMap: 问题答案: 该SortedMap的接口(与实施TreeMap的)应该是你的朋友。 该接口具有以下方法: keySet() 它以升序返回一组键 values() 它以对

  • 问题内容: 我首先遇到以下查询的问题是该子句是在:之前执行的: 该列是由 因此,我尝试了带有子查询和其他bs的各种不同可能的解决方案。最后,我在子句中尝试了一些不同的子查询,女巫要求我将表顺序从子句更改为子句。我决定尝试以下方法: 由于某种原因,这似乎可以正确排序, 但是为什么 呢? 这种变化如何使我的查询比以前更正确地排序? 真的吗 还是只是针对我提出的测试用例而做? 问题答案: 因此,我对以下

  • 我确实意识到Kafka中保证了每个分区的顺序。但是当有多个分区并且生产者没有指定键,而只有1个消费者时,分区会受到什么影响(为什么有1个消费者?对于当前数据加载1很好,有多个分区供将来使用) 1) 订购是否会受到影响? 2) 使用者是否会从分区0,1读取数据。。20一个接一个按顺序? 3) 即使我们指定了分区键,我们是否可以保证我们会进行适当的排序?(哈希冲突的情况除外)

  • 问题内容: 我有一个与数据库对话的servlet,然后返回一个有序(按时间排序)对象的列表。在servlet部分,我有 从日志中,我可以看到数据库以正确的顺序返回了User对象。 在前端,我有 但是顺序改变了。 我只在返回的列表很大(超过130个用户)时才注意到这一点。 我尝试使用Firebug进行调试,Firebug中的“响应选项卡”显示列表的顺序与servlet中的日志不同。 我做错了什么吗?

  • 我有一个应用程序,它试图动态构建一条Javamail消息,组装邮件时可用的Mime正文部分。每个图像的顶部都有一个“GPC”图像,后面是一些HTML文本(正文),一个由HTML构建的结束语,一个结束语“品牌”图像,以及结束语的最后一部分,也是HTML。文件附件可能包括,也可能不包括。如果适用,错误免责声明(HTML)可能会出现在第一张图片之前。 免责声明,正文,结尾, 我搞不懂。在我看来,“父”多

  • 我是Flink的新手,我试图理解Flink是如何在其的并行抽象中命令调用。考虑这个产生部分和的流的例子: 我希望它的输出是流:。事实上,就在这里。 是否可以安全地假设这种情况始终存在,尤其是在从具有大量并行性的源读取数据时?