代码之家  ›  专栏  ›  技术社区  ›  kiritsuku

Scala:用闭包重写代码副本

  •  0
  • kiritsuku  · 技术社区  · 15 年前

    我有这个密码:

    val arr: Array[Int] = ...
    val largestIndex = {
      var i = arr.length-2
      while (arr(i) > arr(i+1)) i -= 1
      i
    }
    val smallestIndex = {
      var k = arr.length-1
      while (arr(largestIndex) > arr(k)) k -= 1
      k
    }
    

    def index(sub: Int, f: => Boolean): Int = {
      var i = arr.length-sub
      while (f) i -= 1
      i
    }
    val largest = index(2, i => arr(i) > arr(i+1))
    val smallest = index(1, i => arr(largest) > arr(i))
    

    问题是我不能在闭包中使用index()方法的参数i。有没有办法避免这个问题?

    2 回复  |  直到 15 年前
        1
  •  3
  •   Daniel C. Sobral    15 年前
    val arr = Array(1,2,4,3,3,4,5)
    def index(sub: Int, f: Int => Boolean): Int = {
      var i = arr.length-sub                       
      while (f(i)) i -= 1                          
      i                                            
    }                                              
    val largest = index(2, i => arr(i) > arr(i+1))
    val smallest = index(1, i => arr(largest) > arr(i))
    
        2
  •  1
  •   Randall Schulz    15 年前
    val arr = Array(1,2,4,3,3,4,5)
    arr: Array[Int] = Array(1, 2, 4, 3, 3, 4, 5)
    
    scala> arr.zipWithIndex.max(Ordering.by((x: (Int, Int)) => x._1))._2
    res0: Int = 6
    
    scala> arr.zipWithIndex.min(Ordering.by((x: (Int, Int)) => x._1))._2
    res1: Int = 0
    

    scala> val pairOrdering = Ordering.by((x: (Int, Int)) => x._1)
    pairOrdering: scala.math.Ordering[(Int, Int)] = scala.math.Ordering$$anon$4@145ad3d
    
    scala> arr.zipWithIndex.max(pairOrdering)._2
    res2: Int = 6
    
    scala> arr.zipWithIndex.min(pairOrdering)._2
    res3: Int = 0
    
    推荐文章