为什么';t scala.collection.Map是否有排序方法?
为了按键或值排序,必须将为什么';t scala.collection.Map是否有排序方法?,scala,Scala,为了按键或值排序,必须将Map转换为Seq有什么特殊原因吗。为什么Scala没有在映射API中包含排序方法(例如sortBy,sortWith,sortByKey,sortByValue)?即使是SortedMap或TreeMap构造器也需要对序列进行操作。因此,以编程方式: val m = Map("01" -> List(34,12,14,23), "11" -> List(22,11,34)) m.toSeq.sortBy(_._1) // this is the way to
Map
转换为Seq
有什么特殊原因吗。为什么Scala没有在映射
API中包含排序方法(例如sortBy
,sortWith
,sortByKey
,sortByValue
)?即使是SortedMap
或TreeMap
构造器也需要对序列进行操作。因此,以编程方式:
val m = Map("01" -> List(34,12,14,23), "11" -> List(22,11,34))
m.toSeq.sortBy(_._1) // this is the way to go
m.sortBy(_._1) // why couldn't this also be the way to go?
映射消费者已经使用元组了
m.foreach {
entry: (String, List[Int]) => println(s"key:${entry._1},value:${entry._2}")
}
对键进行排序会限制
映射的可能实现,这在一般情况下会降低效率。这就是键的顺序取决于实现的原因,也是为什么有一个单独的SortedMap
类型可以在需要时保持键的排序
Map.sortBy
等可以返回SortedMap
,但这与其他收集类型上的等效方法不一致
通常这样做的方式是拥有一个单独的已排序键列表,然后使用该列表在映射上迭代sortBy
返回相同的集合类型,这在您的情况下是一个映射,因此您无法执行排序,因为映射是无序的。因此,需要转换为其他收集类型(在本例中,转换为SortedMap
):
请注意,此排序[String]
将覆盖同一范围内字符串的所有排序。您也可以将其作为参数显式传递,但它要稍微详细一些:
val m = Map("01" -> List(34,12,14,23), "11" -> List(22,11,34))
m.to(SortedMap.sortedMapFactory(((s1,s2) => s1.toInt - s2.toInt): Ordering[String]))
地图是无序的集合。您不能对没有订单的内容进行排序。我担心这太通用了,因为SortedMap
和TreeMap
是Map
s,但是是有序集合。即使如此,您仍然可以对通用映射的条目进行排序(在将其转换为Seq
之后)。也许你想用不同的方式表达你的想法。无论如何,谢谢。Seqs是一种保证订单的og系列。第一个元素排在第一位,第二个元素排在第二位,等等(这适用于列表、向量、流以及任何序列)。另一方面,地图并不能保证秩序。有一些特殊类型的映射保证键的顺序,还有一些其他特殊类型的映射保证插入顺序。但是地图上的特征/类型/种类没有。因此,它不能保证顺序,因此,它可能不会被排序(特别是对于任何给定的谓词)。或者,它不是一个单独的列表,也许是一个在迭代时可以应用于键的顺序定义?但是,从我所看到的,SortedMap
的任何扩展都没有排序方法。因此,我想人们无法规定地图条目在插入时的排序方式——即使是在面向顺序的map
实现中也是如此。但我想效率足够好,这是一个原因…@Niko a SortedMap按键排序。因此,添加sort
类方法是没有意义的。它总是按键排序,你不能说按值排序或其他事情。我认为路易斯只是想尽力提供帮助和彻底SortedMap.from
采用排序[K]
进行简单的重新洗牌,仍然基于键。一个用例是迭代,但对子范围应用新的排序。我知道可以递归地使用span,但它会生成中间映射。也许它会被称为groupFlatMap
。
val m = Map("01" -> List(34,12,14,23), "11" -> List(22,11,34))
m.to(SortedMap.sortedMapFactory(((s1,s2) => s1.toInt - s2.toInt): Ordering[String]))