【问题标题】:Scala: why is there no sortBy on set?Scala:为什么片场没有 sortBy?
【发布时间】:2017-01-20 10:59:04
【问题描述】:

我想知道为什么 Scala 上没有 sortBy 方法 SetSeqList 一样,因为它也扩展了 Iterable...

【问题讨论】:

  • 请注意Iterable不代表顺序,只是可以遍历所有元素。
  • @JosepPrat 有序和有序有区别:stackoverflow.com/questions/1084146/…
  • 好吧,正如你链接的答案所说,排序只能在有顺序的情况下发生,所以评论是完全有效的

标签: scala


【解决方案1】:

Set 是一个有点有序(这就是它是可迭代的原因)但未排序的元素集合。 如果要对元素进行排序,则必须使用SortedSet 实现(TreeSet),您可以在创建新实例时提供排序

更新:ordered 和 sorted 之间的区别并不是很清楚:你可以说 List 是有序但可能未排序,而 Map 是无序且未排序,但 Map 的实现需要将其元素保存在内存中( RAM,磁盘,任何您想要的支持),并且该内存始终是有序的,因此它为任何集合提供了一些顺序(例如插入顺序或存储顺序)。

在 Scala API 中可以看到这种未定义的示例:定义 SortedSet 时,构造函数是:

new TreeSet()(implicit ordering: Ordering[A])

所以用“排序”这个词代替了“排序”

【讨论】:

  • 没有排序有什么原因吗?
  • 哈希表不是按其性质排序的。可迭代并不意味着它是有序的(因为添加元素的顺序可能会影响它的迭代顺序)。
  • @Simon 我猜是因为 Set 的数学概念没有排序,里面的元素没有层次结构
  • 也反过来——Set是一种Map(你可以定义为type Set[T] = Map[T, Unit])。 Map 保证没有两个值与同一个键关联(这对于多映射是可能的),但在一组元组中,您可以有两个具有相同键的对。
  • 您可以说哈希表是按添加元素的顺序和它们的哈希码排序的,所以它的迭代顺序确实是确定性的,但它不是一个非常有用的信息,因为很难预测这个顺序。通常说某事是有序的意味着有一些实际意义,比如你以后将如何迭代它的元素。
猜你喜欢
  • 2015-05-16
  • 2019-04-20
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
  • 2011-05-30
  • 2011-05-04
  • 2017-03-02
  • 2022-11-28
相关资源
最近更新 更多