2010-10-04 80 views
0

重写代码重复我有这样的代码:斯卡拉:带密封盖

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。有没有办法避免这个问题?

回答

3
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)) 
+0

谢谢!这工作正常。 – sschaef 2010-10-04 08:58:48

1
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)] = [email protected] 

scala> arr.zipWithIndex.max(pairOrdering)._2 
res2: Int = 6 

scala> arr.zipWithIndex.min(pairOrdering)._2 
res3: Int = 0 
+0

很好的答案。但它对我来说并不完全正确。每次调用该方法时,我都希望生成数字的下一个排列。用您的代码数字是正确的,但他们没有排序。 – sschaef 2010-10-04 09:35:26

+0

我不知道你的意思是“数字排列”。你是否想要产生一些*独特*数字的排列?使用非递归无状态算法?如果是这样的话,我会(并且)避免使用函数式方法,只使用显式索引来查找数组内的转换点。 – 2010-10-04 13:42:10