为什么 "taking first n elements from an unsorted Map" 没有意义?

Why is "taking first n elements from an unsorted Map" meaningless?

参考教程:
https://hello-scala.com/240-collections-maps.html
请定位:
"Note that the last example probably only makes sense for a sorted Map."
"the last example" 在上面的语句中:

val sortedMap = Map(
    1 -> "a", 
    2 -> "b", 
    3 -> "c",
    4 -> "d"
)
sortedMap.take(2) // Map(1 -> a, 2 -> b)  

根据上面的说法,Map.take(2)只有在Map排序的时候才有意义。

val unSortedMap = Map(
    2 -> "b", 
    1 -> "a", 
    4 -> "d",
    3 -> "c"
)
unSortedMap.take(2) // Map(2 -> b, 1 -> a)  

问题 1:unSortedMap.take(2) 没有意义吗?
问题 2:如果问题 1 的答案是否定的,为什么?

评论指的是文字 SortedMap class。在 SortedMap 中,条目按其键排序。使用您的数据初始化的 SortedMap 始终 具有顺序 SortedMap(1 -> "a", 2 -> "b", 3 -> "c", 4 -> "d"),因为这是对键进行排序的唯一方法。对于普通的 Map,不能保证顺序。特别是,对于 SortedMaptake 尊重 ==:如果 xs == ysxs.take(n) == ys.take(n)。但是对于 Map,您的示例表明情况并非如此。由于 Map 是 "supposed" 映射的无序集合,因此您不应该依赖于它的 "order"。请注意,如果将映射扩展到 6 个元素,它们的顺序将完全改变,因为库的实现细节。如果你真的不关心你得到的映射,那么在通用 Map 上使用 take 才有意义。例如。如果你是 "splitting" 地图是可以接受的,这样你就可以并行操作它的部分,或者如果你是 "chunking" 地图那么你可以序列化它,但你不能使用 take 用于 "logical" 操作,例如将一堆映射添加到 Map 并期望它们按照您放入它们的顺序返回。

键的顺序与未排序的 Map 无关。如果两个映射具有相同的元素,无论它们添加的顺序如何,它们都是相同的:

val mapA = Map(
  4 -> "d",
  3 -> "c",
  2 -> "b",
  1 -> "a",
)

val mapB = Map(
  1 -> "a",
  2 -> "b",
  3 -> "c",
  4 -> "d",
)

val same = mapA == mapB // true
val diff = mapA.take(2) == mapB.take(2) // false or possibly true

所以你无法判断 take.

将返回哪些元素