为什么 "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
,不能保证顺序。特别是,对于 SortedMap
,take
尊重 ==
:如果 xs == ys
则 xs.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
.
将返回哪些元素
参考教程:
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
,不能保证顺序。特别是,对于 SortedMap
,take
尊重 ==
:如果 xs == ys
则 xs.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
.