Do tej pory mam prosty (ale potencjalnie drogi) sposób:
var myMax = sort(myArray,>)[0]
I jak mnie tego uczono w szkole:
var myMax = 0
for i in 0..myArray.count {
if (myArray[i] > myMax){myMax = myArray[i]}
}
Czy istnieje lepszy sposób na uzyskanie maksymalnej wartości z tablicy całkowitej w języku Swift? Idealnie coś, co jest jedną linią, na przykład Ruby.max
maxElement(myArray)
. Zobacz poniżej, jaka jest obecnie druga odpowiedź (Rudolf Adamkovic).Odpowiedzi:
Dany:
Swift 3:
Swift 2:
źródło
Comparable
obiektach, więcNSDecimalNumber
na przykład nie będzie działać.min()
imax()
.minElement
imaxElement
zostały przemianowane namin
imax
. zobacz: github.com/apple/swift-evolution/blob/master/propeals/… Rozumiem twoje zamieszanie, ponieważ darmowe funkcjemin
imax
nadal istnieją. Zobacz na przykład gist.github.com/lorentey/d679064cb29df4558534d619319a1d9eAktualizacja: To powinna być przyjętym prawdopodobnie odpowiedź ponieważ
maxElement
pojawił się Swift.Użyj wszechmocnego
reduce
:Podobnie:
reduce
pobiera pierwszą wartość, która jest wartością początkową wewnętrznej zmiennej akumulatora, następnie stosuje przekazaną funkcję (w tym przypadku jest anonimowa) do akumulatora i każdego elementu tablicy po kolei i przechowuje nową wartość w akumulatorze. Następnie zwracana jest ostatnia wartość akumulatora.źródło
nums.reduce(Int.min, max)
ponieważmax
prototyp jest już zgodny zreduce
oczekiwanymlet numMax = nums.reduce(Int.min, combine: max)
Szybkimi 5,
Array
podobnie jak inneSequence
protokołem w odpowiadające sobie przedmiotów (Dictionary
,Set
itp), składa się z dwóch metod zwanychmax()
imax(by:)
ten powrót maksymalna elementów w sekwencji lubnil
jeśli sekwencja jest pusta.# 1. Używając
Array
'smax()
metodyJeżeli typ elementu wewnątrz firmy Przylega do sekwencji
Comparable
protokołu (może to byćString
,Float
,Character
lub jeden z niestandardowej klasy lub struktury), będzie w stanie wykorzystaćmax()
, że ma następującą deklarację :Poniższe kody Playground pokazują do użycia
max()
:# 2. Używając
Array
'smax(by:)
metodyJeśli typ elementu w twojej sekwencji nie jest zgodny z
Comparable
protokołem, będziesz musiał użyćmax(by:)
tego, który ma następującą deklarację :Poniższe kody Playground pokazują do użycia
max(by:)
:źródło
Pozostałe odpowiedzi są poprawne, ale nie zapominaj, że możesz również użyć operatorów kolekcji w następujący sposób:
możesz też znaleźć średnią w ten sam sposób:
Ta składnia może być mniej jasna niż niektóre inne rozwiązania, ale interesujące jest to, że
-valueForKeyPath:
nadal można jej używać :)źródło
Możesz używać z
reduce
:źródło
źródło
var myMax = sort(myArray,>)[0]
Ze Swift 1.2 (a może wcześniej) musisz teraz użyć:
Do pracy z wartościami Double użyłem czegoś takiego:
źródło
let numMax = nums.reduce(-Double.infinity, combine: max)
, maksymalna sygnatura funkcji pasuje do sygnatury connect: parameter.W Swift 2.0 metody protokołu
minElement
imaxElement
stają się metodamiSequenceType
protokołu, należy je nazywać:Używanie
maxElement
jako takiej funkcjimaxElement(a)
jest niedostępne teraz .Składnia języka Swift jest zmienna , więc mogę to potwierdzić w Xcode w wersji 7 beta6 .
Może zostać zmodyfikowany w przyszłości, więc sugeruję, abyś lepiej sprawdził dokument przed użyciem tych metod.
źródło
Swift 3.0
Możesz wypróbować ten kod programowo.
źródło
Oto test wydajności dla zamieszczonych tutaj rozwiązań. https://github.com/tedgonzalez/MaxElementInCollectionPerformance
Jest to najszybsze w przypadku Swift 5
array.max()
źródło
Użyj poniższych prostych linii kodu, aby znaleźć maksimum z tablicy;
źródło
Możesz również posortować tablicę, a następnie użyć
array.first
lubarray.last
źródło