【问题标题】:How map function does sorting in scalamap函数如何在scala中进行排序
【发布时间】: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


    【解决方案1】:

    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)
    

    【讨论】:

      【解决方案2】:

      它不会对它们进行排序,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)
      

      【讨论】:

      • 它通过索引对列表进行重新排序,这与排序不同吗?
      • 如何将列表传递给 lambda 调用 apply 方法?
      • 我不会称之为重新排序,如果你在这里使用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,这使得创建对象实例喜欢案例类很容易
      • @hariharan: List[T]Function[Int, T] 的子类。
      【解决方案3】:

      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)
      

      【讨论】:

        【解决方案4】:

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

        您的代码片段是一个碰巧排序的特定案例。如果是脱糖,则如下。

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

        它应用unsorted.applykeys 的每个值(用作索引)。

        【讨论】:

          【解决方案5】:

          根本没有排序。这是正常情况:map 方法接受一个 lambda 并将其应用于源中的每个元素。只需更改您的 sorted 列表,您就会看到它。

          【讨论】:

            猜你喜欢
            • 2016-09-11
            • 2010-11-11
            • 2019-10-27
            • 1970-01-01
            • 1970-01-01
            • 2014-07-13
            • 1970-01-01
            • 2010-10-29
            相关资源
            最近更新 更多