2010-10-04 78 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