2

take在 Scala 上使用该函数是否安全Map?我认为Maps 是无序的,因此myMap.take(2)将返回 2 个随机元素myMap。但是对解释器的测试让我觉得它是安全的:

scala> val z = Map(1 -> 10, 2 -> 20, 3 -> 30, 4 -> 40)
z: scala.collection.immutable.Map[Int,Int] = Map(1 -> 10, 2 -> 20, 3 -> 30, 4 -> 40)

scala> z.take(2)
res1: scala.collection.immutable.Map[Int,Int] = Map(1 -> 10, 2 -> 20)

scala> z.take(2)
res2: scala.collection.immutable.Map[Int,Int] = Map(1 -> 10, 2 -> 20)

scala> z.take(2)
res3: scala.collection.immutable.Map[Int,Int] = Map(1 -> 10, 2 -> 20)

scala> z.take(2)
res4: scala.collection.immutable.Map[Int,Int] = Map(1 -> 10, 2 -> 20)

那么,take在 a上使用是否安全Map,还是我需要使用 a ListMap

4

4 回答 4

3

在不确切知道您要实现的目标的情况下,您可能需要考虑使用 a SortedMap,它可以保证键是按顺序排序的。考虑Scala REPL中的以下两个示例:

scala> val z = Map(4 -> 40, 3 -> 30, 1 -> 10, 2 -> 20)
z: scala.collection.immutable.Map[Int,Int] = Map(4 -> 40, 3 -> 30, 1 -> 10, 2 -> 20)

scala> z.take(2)
res0: scala.collection.immutable.Map[Int,Int] = Map(4 -> 40, 3 -> 30)

scala> import scala.collection.immutable.SortedMap
import scala.collection.immutable.SortedMap

scala> val zs = SortedMap(4 -> 40, 3 -> 30, 1 -> 10, 2 -> 20)
zs: scala.collection.immutable.SortedMap[Int,Int] = Map(1 -> 10, 2 -> 20, 3 -> 30, 4 -> 40)

scala> zs.take(2)
res1: scala.collection.immutable.SortedMap[Int,Int] = Map(1 -> 10, 2 -> 20)

正如@jwvh 指出的那样,在常规中没有定义的顺序,但是一旦定义了顺序就固定了,因此对于给定的相同地图实例Map,您总是会返回相同的成员。.take(2)但是,您返回的值取决于地图的创建顺序。

同时,在 aSortedMap中,键始终是有序的,因此当您使用.take(2)元素时,无论定义顺序如何,您总是会得到相同的两个元素:具有两个最低键值的元素。

有关详细信息,请参阅该方法的帮助take

于 2018-09-22T00:29:21.687 回答
3

每次你很可能会得到相同的 2 take(2),但不知道你会首先得到哪个 2 。

val y = Map(1 -> 10, 2 -> 20, 3 -> 30, 4 -> 40, 5 -> 5)
y.take(2)  //res0: Map[Int,Int] = Map(5 -> 5, 1 -> 10)
于 2018-09-21T23:29:05.053 回答
1

Scala 中的不可变映射具有用于 0 到 4 个元素的特殊子类型,您可以在代码中看到,作为一种优化。碰巧的是,Map.apply最多有 4 个参数会生成这些类之一的实例,因此迭代它总是会按照传递给的顺序生成元素Map.apply

于 2018-09-22T06:36:20.707 回答
-1

Scala Map 上是否明确定义了 take 函数?

这取决于您对“明确定义”的确切定义,但我认为,是的,对于“明确定义”的最常见解释,它是明确定义的。

文档清楚地列出了所有可能输入的所有可能结果,并且没有模棱两可或未指定的输入。涵盖所有极端案例:

  • 如果集合少于n元素,则将返回整个集合。
  • 如果n为负数,将返回一个空集合。
  • 如果集合是无序的,则将返回任意元素。

take在 Scala 上使用该函数是否安全Map

这取决于您对“安全”的确切定义,但我认为,是的,对于“安全”的最常见解释,它是安全的。

  • 它是静态类型安全的。
  • 它是动态类型安全的。
  • 它不会抛出异常。

我认为Maps 是无序的,因此myMap.take(2)将返回 2 个随机元素myMap

不,文档说:

注意:可能会针对不同的运行返回不同的结果,除非对基础集合类型进行了排序。

这意味着将返回任意元素,而不是随机元素。

于 2018-09-22T10:20:29.953 回答