Até agora, tenho uma maneira simples (mas potencialmente cara):
var myMax = sort(myArray,>)[0]
E como eu fui ensinado a fazer isso na escola:
var myMax = 0
for i in 0..myArray.count {
if (myArray[i] > myMax){myMax = myArray[i]}
}
Existe uma maneira melhor de obter o valor máximo de uma matriz inteira no Swift? Idealmente, algo como uma linha como a de Ruby.max
maxElement(myArray)
. Veja qual é atualmente a segunda resposta (de Rudolf Adamkovic) abaixo.Respostas:
Dado:
Swift 3:
Swift 2:
fonte
Comparable
objetos, portantoNSDecimalNumber
não funcionará por exemplo.min()
emax()
.minElement
emaxElement
foram renomeado paramin
emax
. consulte: github.com/apple/swift-evolution/blob/master/proposals/… Entendo sua confusão, porque as funções livresmin
emax
também ainda existem. Veja, por exemplo, gist.github.com/lorentey/d679064cb29df4558534d619319a1d9eAtualização: Essa provavelmente deve ser a resposta aceita desde que
maxElement
apareceu no Swift.Use o Todo
reduce
- Poderoso :Similarmente:
reduce
pega um primeiro valor que é o valor inicial para uma variável interna do acumulador e aplica a função passada (aqui, é anônima) ao acumulador e a cada elemento da matriz sucessivamente, e armazena o novo valor no acumulador. O último valor do acumulador é retornado.fonte
nums.reduce(Int.min, max)
desdemax
's protótipo já corresponde ao tipo quereduce
está esperandolet numMax = nums.reduce(Int.min, combine: max)
Com Swift 5,
Array
, assim como outrosSequence
objectos conforme protocolo (Dictionary
,Set
, etc), tem dois métodos de chamadasmax()
emax(by:)
que o elemento de retorno máxima na sequência ounil
se a sequência está vazia.# 1 Usando
Array
omax()
métodoSe o tipo de elemento dentro de seus conforma seqüência de
Comparable
protocolo (que pode serString
,Float
,Character
ou um de sua classe personalizada ou struct), você vai ser capaz de usarmax()
que tem a seguinte declaração :Os seguintes códigos do Playground são exibidos
max()
:# 2 Usando
Array
omax(by:)
métodoSe o tipo de elemento dentro da sua sequência não
Comparable
estiver em conformidade com o protocolo, você precisará usarmax(by:)
a seguinte declaração :Os seguintes códigos do Playground são exibidos
max(by:)
:fonte
As outras respostas estão todas corretas, mas não esqueça que você também pode usar operadores de coleta, da seguinte maneira:
você também pode encontrar a média da mesma maneira:
Essa sintaxe pode ser menos clara do que algumas das outras soluções, mas é interessante ver que
-valueForKeyPath:
ainda pode ser usado :)fonte
Você pode usar com
reduce
:fonte
fonte
var myMax = sort(myArray,>)[0]
Com o Swift 1.2 (e talvez antes), agora você precisa usar:
Para trabalhar com valores Double, usei algo como isto:
fonte
let numMax = nums.reduce(-Double.infinity, combine: max)
, a assinatura da função max corresponde à assinatura do parâmetro combine:No Swift 2.0, os métodos de protocolo
minElement
emaxElement
torne - seSequenceType
, você deve chamá-los como:Usar
maxElement
como uma função como nãomaxElement(a)
está disponível agora.A sintaxe do Swift está em fluxo, por isso posso confirmar isso no Xcode versão7 beta6 .
Pode ser modificado no futuro, então sugiro que você verifique melhor o documento antes de usar esses métodos.
fonte
Swift 3.0
Você pode tentar esse código programaticamente.
fonte
Aqui está um teste de desempenho para as soluções postadas aqui. https://github.com/tedgonzalez/MaxElementInCollectionPerformance
Este é o mais rápido para o Swift 5
array.max()
fonte
Use abaixo linhas simples de código para encontrar o máximo da matriz;
fonte
Você também pode classificar sua matriz e, em seguida, usar
array.first
ouarray.last
fonte