【发布时间】:2016-04-28 07:07:30
【问题描述】:
以下代码sn-p
val keys=List(3,2,1,0)
val unsorted=List(1, 2, 3, 4)
val sorted =keys map unsorted
根据keys进行排序。
通常,map 方法采用 lambda 并将其应用于源中的每个元素。相反,上面的代码采用一个列表并根据索引进行排序。
在这种特殊情况下发生了什么?
【问题讨论】:
标签: scala collections
以下代码sn-p
val keys=List(3,2,1,0)
val unsorted=List(1, 2, 3, 4)
val sorted =keys map unsorted
根据keys进行排序。
通常,map 方法采用 lambda 并将其应用于源中的每个元素。相反,上面的代码采用一个列表并根据索引进行排序。
在这种特殊情况下发生了什么?
【问题讨论】:
标签: scala collections
List 是一个从它的索引到它的值的偏函数。你可以这样看:
scala> List(3,2,1,0) map (i => List(1,2,3,4)(i))
res0: List[Int] = List(4, 3, 2, 1)
验证
scala> val f: Int => Int = List(1, 2, 3, 4)
f: Int => Int = List(1, 2, 3, 4)
【讨论】:
它不会对它们进行排序,map 有一个函数,让我们看看:
该语句转换为:
keys.map(unsorted.apply)
Scala 的List.apply(n: Int) 函数返回列表的nth 元素,在这种情况下map 使得它:
unsorted(3), unsorted(2), unsorted(1), unsorted(4)
这是
4,3,2,1 在这种情况下只是随机排序。
测试一下:
scala> val keys = List(3,0,1,2)
keys: List[Int] = List(3, 0, 1, 2)
scala> val unsorted = List(10,20,30,40)
unsorted: List[Int] = List(10, 20, 30, 40)
scala> keys map unsorted
res0: List[Int] = List(40, 10, 20, 30)
【讨论】:
List(0,0,0,0) 作为键,你会得到List(10,10,10,10) 或List(5,5,5,5) 你会得到java.lang.IndexOutOfBoundsException: 5 或者如果你给List(0)它将返回List(10),而不是我们可以说的orderin,它返回与给定索引对应的元素,对于您的另一个问题,如果您将对象传递给map,scala将默认使用apply,这使得创建对象实例喜欢案例类很容易
List[T] 是Function[Int, T] 的子类。
在keys map unsorted 中,对于keys 中的每个值,我们调用列表unsorted 中的apply 方法,该方法在key 位置生成元素。
交换keys 中的元素并记下结果,例如记下最后一个键,
val keys=List(2,1,0,3)
val sorted = keys map unsorted
sorted: List[Int] = List(3, 2, 1, 4)
【讨论】:
函数.map与排序没有特定关系。
您的代码片段是一个碰巧排序的特定案例。如果是脱糖,则如下。
/* keys */List(3,2,1,0).map { i: Int =>
unsorted.apply(i)
}
它应用unsorted.apply 和keys 的每个值(用作索引)。
【讨论】:
根本没有排序。这是正常情况:map 方法接受一个 lambda 并将其应用于源中的每个元素。只需更改您的 sorted 列表,您就会看到它。
【讨论】: