Scala: переписать дублирование кода с помощью замыканий - PullRequest
0 голосов
/ 04 октября 2010

У меня есть этот код:

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

Проблема в том, что я не могу использовать параметр i метода index () в замыкании.Есть ли способ избежать этой проблемы?

Ответы [ 2 ]

3 голосов
/ 04 октября 2010
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))
1 голос
/ 04 октября 2010
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...