map函数如何在scala中进行排序

map函数如何在scala中进行排序,scala,collections,Scala,Collections,下面的代码片段 val keys=List(3,2,1,0) val unsorted=List(1, 2, 3, 4) val sorted =keys map unsorted 根据键进行排序 通常,map方法获取lambda并将其应用于源中的每个元素。相反,上面的代码获取一个列表并基于索引进行排序 在这种特殊情况下会发生什么?列表是一个从索引到值的局部函数。你可以这样看: scala> List(3,2,1,0) map (i => List(1,2,3,4)(i)) res

下面的代码片段

val keys=List(3,2,1,0)
val unsorted=List(1, 2, 3, 4)
val sorted =keys map unsorted
根据
键进行排序

通常,map方法获取lambda并将其应用于源中的每个元素。相反,上面的代码获取一个列表并基于索引进行排序

在这种特殊情况下会发生什么?

列表是一个从索引到值的局部函数。你可以这样看:

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)

键映射未排序
中,对于
中的每个值,我们调用列表
未排序
中的
应用
方法,该方法在
位置生成元素

交换
键中的元素
并记下结果,例如记下最后一个键

val keys=List(2,1,0,3)

val sorted = keys map unsorted
sorted: List[Int] = List(3, 2, 1, 4)

它不会对它们进行排序,
map
使用一个函数,让我们看看: 这句话的意思是:

keys.map(unsorted.apply)
Scala的
List.apply(n:Int)
函数返回
n
List的第个元素,在本例中
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)

函数
.map
与排序没有特定关系

你的狙击手是一个特殊的情况,碰巧排序。如果脱胶,则按如下操作

/* keys */List(3,2,1,0).map { i: Int =>
  unsorted.apply(i)
}

它适用于
键的每个值(用作索引)。

它根本不排序。这是正常情况:map方法获取lambda并将其应用于源中的每个元素。只要更改您的
排序的
列表,您就会看到它。

它会按索引对列表重新排序,这与排序不同吗?将列表传递给lambda调用如何应用方法?我不会将其称为重新排序,如果您使用
列表(0,0,0,0,0)
作为键,您将得到
列表(10,10,10)
列表(5,5,5)
您将获得
java.lang.IndexOutOfBoundsException:5
或者如果您给出
List(0)
它将返回
List(10)
,而不是我们可以说的orderin,它返回与给定索引对应的元素,对于您的另一个问题,如果您将对象传递给map,scala将默认使用apply,这使得创建像案例类这样的对象的实例成为可能easy@hariharan:
List[T]
函数[Int,T]
的一个子类。