Hasta ahora tengo una forma simple (pero potencialmente costosa):
var myMax = sort(myArray,>)[0]
Y cómo me enseñaron a hacerlo en la escuela:
var myMax = 0
for i in 0..myArray.count {
if (myArray[i] > myMax){myMax = myArray[i]}
}
¿Existe una mejor manera de obtener el valor máximo de una matriz de enteros en Swift? Idealmente, algo que sea de una línea como Ruby.max
maxElement(myArray)
. Vea cuál es actualmente la segunda respuesta (la de Rudolf Adamkovic) a continuación.Respuestas:
Dado:
Swift 3:
Rápido 2:
fuente
Comparable
objetos, porNSDecimalNumber
lo que no funcionará, por ejemplo.min()
ymax()
.minElement
ymaxElement
fueron renombrados amin
ymax
. ver: github.com/apple/swift-evolution/blob/master/proposals/… Entiendo su confusión, porque las funciones gratuitasmin
ymax
también existen. Ver, por ejemplo, gist.github.com/lorentey/d679064cb29df4558534d619319a1d9eActualización: esta probablemente debería ser la respuesta aceptada desde que
maxElement
apareció en Swift.Usa el todopoderoso
reduce
:Similar:
reduce
toma un primer valor que es el valor inicial para una variable acumuladora interna, luego aplica la función pasada (aquí, es anónima) al acumulador y a cada elemento de la matriz sucesivamente, y almacena el nuevo valor en el acumulador. A continuación, se devuelve el último valor del acumulador.fuente
nums.reduce(Int.min, max)
dado quemax
el prototipo de 'ya coincide con el tipo quereduce
se esperalet numMax = nums.reduce(Int.min, combine: max)
Con Swift 5,
Array
al igual que otrosSequence
objetos de protocolo conforme (Dictionary
,Set
, etc.), tiene dos métodos llamadosmax()
ymax(by:)
que retornan el máximo elemento en la secuencia onil
si la secuencia está vacía.# 1. Usando
Array
elmax()
método deSi el tipo de elemento dentro de la secuencia se ajusta a
Comparable
protocolos (puede serString
,Float
,Character
o uno de su clase personalizada o estructura), usted será capaz de usarmax()
que tiene la siguiente declaración :Se muestran los siguientes códigos de Playground para usar
max()
:# 2. Usando
Array
elmax(by:)
método deSi el tipo de elemento dentro de su secuencia no se ajusta al
Comparable
protocolo, deberá usarmax(by:)
que tenga la siguiente declaración :Se muestran los siguientes códigos de Playground para usar
max(by:)
:fuente
Las otras respuestas son todas correctas, pero no olvide que también puede usar operadores de recolección, de la siguiente manera:
también puedes encontrar el promedio de la misma manera:
Esta sintaxis puede ser menos clara que algunas de las otras soluciones, pero es interesante ver que
-valueForKeyPath:
aún se puede usar :)fuente
Puede usar con
reduce
:fuente
fuente
var myMax = sort(myArray,>)[0]
Con Swift 1.2 (y tal vez antes) ahora necesita usar:
Para trabajar con valores dobles usé algo como esto:
fuente
let numMax = nums.reduce(-Double.infinity, combine: max)
, la firma de la función máxima coincide con la firma del parámetro combine :.En Swift 2.0, los métodos de protocolo
minElement
y semaxElement
conviertenSequenceType
, debería llamarlos como:El uso
maxElement
como función como nomaxElement(a)
está disponible ahora.La sintaxis de Swift está cambiando, así que puedo confirmar esto en Xcode versión 7 beta6 .
Es posible que se modifique en el futuro, por lo que le sugiero que consulte el documento antes de usar estos métodos.
fuente
Swift 3.0
Puede probar este código mediante programación.
fuente
Aquí hay una prueba de rendimiento para las soluciones publicadas aquí. https://github.com/tedgonzalez/MaxElementInCollectionPerformance
Este es el más rápido para Swift 5
array.max()
fuente
Utilice las siguientes líneas de código simples para encontrar el máximo de la matriz;
fuente
También puede ordenar su matriz y luego usar
array.first
oarray.last
fuente