2013-03-21 4 views
4

Кто-нибудь знает, как получить индекс наибольшего элемента из этой функции:индекс наибольшего элемента в массиве

Программирование языка является Scala

def indexOfLargestElement(arr: Array[Int]): Int = 

Например:

indexOfLargestElement(Array(1, -6, 4, 5, 2, -1)) == 3 

Я не понимаю. -0-

Спасибо за помощь!

+0

Возможный дубликат [Как могу ли я найти индекс максимального значения в списке в Scala?] (http://stackoverflow.com/questions/14011181/how-can-i-find-the-index-of-the-max imum-value-in-a-list-in-scala) – Suma

ответ

5

Вал л = Array (1, -6, 4, 5, 2, -1)

l.indexOf (l.max)

+5

Обратите внимание, что для этого потребуется ** двух ** обходов по массиву –

+1

Не более двух обходов. Второй обход сворачивается, как только он находит элемент. – hughw

10

Вот как сделать это с помощью одного обхода:

def indexOfLargest(array: Seq[Int]): Int = { 
    val result = array.foldLeft(-1,Int.MinValue,0) { 
     case ((maxIndex, maxValue, currentIndex), currentValue) => 
      if(currentValue > maxValue) (currentIndex,currentValue,currentIndex+1) 
      else (maxIndex,maxValue,currentIndex+1) 
     } 
    result._1 
} 

Это будет использовать кортеж (индекс максимального элемента, значение максимального элемента, индекс curent) для хранения данных в цикле.

+0

Спасибо за ответы, они мне очень помогли :) просто еще один вопрос .. было бы возможно сделать это с for-loop? – 2013-03-22 10:59:29

5
scala> :paste 
// Entering paste mode (ctrl-D to finish) 

@annotation.tailrec final def indexOfLargestElement(a: Array[Int], i: Int = -1, mi: Int = -1, ma: Int = Int.MinValue): Int = { 
    val i1 = i + 1 
    if (i1 < a.length) { 
    val ai1 = a(i1) 
    if (ai1 >= ma) indexOfLargestElement(a, i1, i1, ai1) 
    else indexOfLargestElement(a, i1, mi, ma) 
    } else mi 
} 

// Exiting paste mode, now interpreting. 

indexOfLargestElement: (a: Array[Int], i: Int, mi: Int, ma: Int)Int 

scala> indexOfLargestElement(Array(1, -6, 4, 5, 2, -1)) 
res0: Int = 3 

scala> indexOfLargestElement(Array()) 
res1: Int = -1 

scala> indexOfLargestElement(Array(Int.MinValue)) 
res2: Int = 0 
+3

Почему все downvotes? Это правильное решение (а также очень быстрое, хотя и не самое простое для понимания). –

+0

Я нахожу это понятным, как @ alexwriteshere, логика примерно такая же, только выраженная императивно. –

4

Я не уверен, что такое производительность, потому что могут быть дорогостоящие неявные преобразования, и я не могу сказать, какой алгоритм сортировки используется на практике.

Тем не менее это он

scala> val arr = Array(1, -6, 4, 5, 2, -1) 
arr: Array[Int] = Array(1, -6, 4, 5, 2, -1) 

scala> arr.zipWithIndex.maxBy(_._1)._2 
res1: Int = 3 
+0

или 'arr.maxBy (identity)' – sourcedelica

+0

это 'reduceLeft ((x, y) => if (cmp.gteq (f (x), f (y))) x else y)' where 'implicit cmp: Заказ [B] '(см.' TraversableOnce') – sourcedelica

+0

@sourcedelica ваши предложения вернут элемент max, а не индекс ... или я что-то упустил? –

0

Мое решение является очень простой, но легко понять

/** 
* Returns the max index or -1 if there is no max index 
*/ 
def getMaxIndex(array: Array[Int]): Int = { 
    var maxIndex = -1 
    var max = Int.MinValue 
    for { 
    index <- 0 until array.length 
    element <- array 
    } { 
    if (element > max) { 
     max = element 
     maxIndex = index 
    } 
    } 
    maxIndex 
} 

Это в значительной степени так же, как

/** 
* Returns the max index or -1 if there is no max index 
*/ 
def getMaxIndex(array: Seq[Int]): Int = { 
    val startIndex = 0 
    val result = array.foldLeft(-1, Int.MinValue, startIndex) { 
     case ((maxIndex, max, index), element) => { 
      if(element > max) (index, element, index+1) 
      else (maxIndex, max, index+1) 
     } 
    } 
    result._1 
}