2010-10-04 9 views
0

J'ai ce code:Scala: duplication de code Réécrire avec des fermetures

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 
} 

Mais il y a beaucoup de duplication de code. J'ai essayé de réécrire cela avec des fermetures mais j'ai échoué. J'ai essayé quelque chose comme ceci:

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)) 

Le problème est que je ne peux pas utiliser le paramètre i de l'indice de la méthode() dans la fermeture. Y a-t-il un moyen d'éviter ce problème?

Répondre

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

Merci! Cela fonctionne bien. – sschaef

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 

ou

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

Bonne réponse. Mais cela ne fonctionne pas absolument correct pour moi. A chaque appel de la méthode je veux générer la prochaine permutation de nombre. Avec votre code, les chiffres sont corrects, mais ils ne sont pas triés. – sschaef

+0

Je ne sais pas ce que vous voulez dire par "permutation de nombre". Essayez-vous de générer des permutations de nombres * distincts *? En utilisant un algorithme non récursif et sans état? Si c'est le cas, j'éviterais (et j'éviterais) l'approche fonctionnelle et j'utiliserais simplement des index explicites pour trouver les points de transition dans le tableau. –