Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';t scala.collection.Map是否有排序方法?_Scala - Fatal编程技术网

为什么';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]))