有序集合和排序集合之间有什么区别?


132

是否有任何区别排序有序集合?


1
不要从字面上理解答案。虽然这是一种广泛理解和公认的定义,但它不是计算机术语中的事实上的定义。例如,在.NET中,称为“已排序”可枚举的接口IOrderedEnumerable (有趣的是,它在.NET中不是非常一致。在.NET中称为“插入顺序”方面字典OrderedDictionary,有些人认为与之相比是用词不当,IndexedDictionary。是的,在Java世界中(大多数地方也是),它们表示您的答案。有关更多信息,请参见此处
nawfal 2014年

如果某个实现实例的命名错误,则没有理由传播其错误。这是一个很好的问题,有很好的答案。使用正确的命名-有助于减少所有人(包括您自己)的困惑。
foo

Answers:


166

一个有序集合意味着该集合的元素有一个特定的顺序。顺序与值无关。甲列表是一个例子。

一个分类收集的手段,不仅这个集合中有顺序,但顺序取决于元素的值。一个SortedSet是一个示例。

相反,没有任何顺序集合可以按任何顺序维护元素。一就是一个例子。


1
优先队列是有序集合吗?
外汇兑换

@overexchange给定以上定义,在大多数情况下,优先级队列将是排序的集合,因为优先级几乎总是定义为队列中元素的属性。
cdeszaq

如果SortedSet从Set继承并与它具有is-a关系,那么您如何说Set没有任何顺序
xpioneer

79

有序集合根据您将元素放入集合或从集合中删除元素的顺序来维护元素的顺序。

排序的集合使元素根据排序标准进行排序。


18

Java使用“有序集合”来表示诸如List之类的集合,其中(与HashSet不同),该集合会记住元素应处于的顺序。因此,可以按顺序将元素添加到集合中的特定“位置” 。

Java使用“排序集合”来表示诸如SortedSet之类的集合,其中(与List不同),迭代器遍历该集合的顺序与指定的Comparator或元素的自然顺序一致。

因此,区别在于排序是否取决于值(“已排序”),还是元素独立于其值而具有的属性(“排序”)。


1
好的答案,+ 1提到“ Java”。它在大多数地方也很受公认的定义,例如OrderedDict在python中。但是在.NET中,“可排序”可枚举的接口称为IOrderedEnumerable。因此,这取决于。只是说..
nawfal

9

是的,尽管概念相似。

List 是一个有序集合:每个元素都有一个索引,该索引形成元素的顺序,但通常与元素本身的任何属性都不相关。

SortedMap并且SortedSet是已排序的集合,这意味着整个集合中的迭代将按照从元素本身派生的顺序进行。例如,如果您有a,SortedSet<String>则字符串将根据字典顺序进行排序。

当外部排序与元素的排序顺序相同时,可以对排序的Collection 进行排序,但不必排序(例如,使用之后Collections.sort())。排序后的集合始终是隐式排序的(即始终有一个“第一个”元素,并且只要不添加另一个较小的元素,它就总是相同的)。


5

有序集合是跟踪每个元素插入的连续索引的集合。

在整个使用Comparable接口的过程中,排序的集合还取决于要插入的元素的值时,排序的集合是有序集合,该接口为您提供了一种定义排序标准的方法。

希望对您有所帮助。


2

排序将暗示根据Comparable或Comparator的实现进行排序。排序将暗示它遵循插入顺序或顺序的某些其他定义,该定义是一致且已定义的,否则是任意的。

因此,将根据String.compareTo方法对字符串的排序列表进行排序。列表可能包含以任意顺序插入的字符串列表,但是该顺序将始终保持不变。

当然,Collections类上有一些方法可以对列表进行排序。


1

排序的集合通常是指根据算法在其上起作用的元素的属性,将元素从最小值到最大值进行排序,反之亦然。

对于interger集合,排序可能是从一个人集合的最小数到最大数,它可能因人的身高或人的体重等而感到不满意。

当谈论顺序时,通常是指插入顺序。排序后可能会更改顺序


0

排序的集合有序的集合

1.排序的集合

排序的集合是通过利用Java集合框架提供的排序功能来对集合进行排序。使用Java比较器从数据库读取数据后,排序发生在运行Hibernate的JVM的内存中。

如果您的收藏不大,将是一种更有效的排序方式。由于它发生在jvm内存中,因此可能会抛出“内存不足”错误。

2.订单收集

订单集合通过在查询中指定order-by子句对集合进行排序,以便在检索时对该集合进行排序。如果您的收藏非常大,它将是一种更有效的排序方式。与排序的集合相比,它是快速的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.