检查数组[A]是否已排序?

时间:2017-06-17 23:15:38

标签: arrays scala functional-programming

在解决“Scala中的函数编程”中发现的问题时:

  

实现isSorted,它检查是否根据给定的比较函数对Array [A]进行排序:

def isSorted[A](as: Array[A], ordered: (A,A) => Boolean): Boolean

将我的答案与作者提供的以下解决方案进行比较:

  // Exercise 2: Implement a polymorphic function to check whether
  // an `Array[A]` is sorted
  def isSorted[A](as: Array[A], gt: (A,A) => Boolean): Boolean = {
    @annotation.tailrec
    def go(n: Int): Boolean =
      if (n >= as.length-1) true
      else if (gt(as(n), as(n+1))) false
      else go(n+1)

    go(0)
  }

我对以下代码行感到困惑:else if (gt(as(n), as(n+1))) false

我认为在Scala中使用函数作为参数时,需要在当前函数范围之外实际定义一个单独的函数(即,定义另一个函数来执行gt需要做的事情) ?我没有在其他任何地方看到gt定义,那么它如何在Boolean中提供isSorted值?

我的假设是正确的,还是我完全没有使用函数作为参数?非常感谢详细解释。

1 个答案:

答案 0 :(得分:4)

在这种情况下,gt是作为参数传递给isSorted的函数; 让我们将它与任何其他参数进行比较,比如a: Int。我们来看看以下函数:

def increaseByOne(a: Int): Int = a + 1

关于gt的问题等同于询问:“ increaseByOne如果a从未分配值,a如何使用increaseByOne” 。显然,a方法的调用者必须传递一些值作为gt的值,但是参数的概念是命名一些提供给它的值。方法

同样适用于isSorted:它是isSorted参数。在您提供的代码中,我们没有看到gt来电者,所以我们没有看到isSorted可能是什么的示例 - 但显然是 gt的实现不需要假设isSorted的创建方式和位置,它作为参数传递,因此可以在isSorted(Array(1,3,6), (a: Int, b: Int) => a > b) 中使用。

我们可以设想一个用法如:

(a: Int, b: Int) => a > b

此处,gt将是JSONObject jObject = new JSONObject(jsonString); Iterator<String> keys = jObject.keys(); String key; JSONArray jsonArray; String value; while (keys.hasNext()) { key = keys.next(); countriesList.add(key); jsonArray = jObject.getJSONArray(key); for (int i = 0; i < jsonArray.length(); i++) { value = jsonArray.getString(i); citiesList.add(value); } countryCities.put(key, citiesList); citiesList.clear(); 的值。