powiedzmy, że mamy niestandardową klasę o nazwie imageFile i ta klasa zawiera dwie właściwości.
class imageFile {
var fileName = String()
var fileID = Int()
}
wiele z nich przechowywanych w tablicy
var images : Array = []
var aImage = imageFile()
aImage.fileName = "image1.png"
aImage.fileID = 101
images.append(aImage)
aImage = imageFile()
aImage.fileName = "image1.png"
aImage.fileID = 202
images.append(aImage)
pytanie brzmi: jak mogę posortować tablicę obrazów według ASC lub DESC „fileID”?
Odpowiedzi:
Najpierw zadeklaruj swoją tablicę jako tablicę maszynową, aby móc wywoływać metody podczas iteracji:
Następnie możesz po prostu zrobić:
Swift 2
Swift 3+
Powyższy przykład podaje porządek sortowania desc
źródło
NSManagedObject
podklasę o nazwie CheckInAndOut . W osobnym pliku zadeklarowałem tablicę typową dla obiektów tego typu, a gdy próbuję ją posortować , pojawia się błąd Nie można znaleźć elementu członkowskiego . Wiesz, dlaczego to jest?firstName
ilastName
w tablicyPerson
obiektów. Najpierw chcę uporządkować gofirstName
i potemlastName
. Jak mogę to zrobić?images.sortInPlace({ $0.fileID > $1.fileID })
?[ Zaktualizowano dla Swift 3 z sortowaniem (według :) ] To, wykorzystując końcowe zamknięcie:
gdzie używasz odpowiednio
<
lub w>
zależności od ASC lub DESC. Jeśli chcesz zmodyfikowaćimages
tablicę , użyj następujących poleceń:Jeśli zamierzasz to robić wielokrotnie i wolisz zdefiniować funkcję, jednym ze sposobów jest:
a następnie użyj jako:
źródło
sort
nie kompiluje się już z tą składnią w Xcode 8. Xcode 8 mówi, że$0.fileID < $1.fileID
produkuje Bool, a nie Wynik Porównawczy.Prawie każdy daje jak bezpośrednio, pozwól mi pokazać rozwój:
możesz użyć metod instancji Array:
Aby uzyskać szczegółowe wyjaśnienie dotyczące zasady sortowania, zobacz Sorted Function .
źródło
Szybki 3
źródło
people.sort { $0.email > $1.email }
W Swift 5
Array
ma dwie metody o nazwiesorted()
isorted(by:)
. Pierwsza metodasorted()
, ma następującą deklarację:Druga metoda
sorted(by:)
ma następującą deklarację:# 1. Sortuj w kolejności rosnącej dla porównywalnych obiektów
Jeśli typ elementu w Twojej kolekcji jest zgodny
Comparable
protokołem, będziesz mógł użyć gosorted()
do posortowania elementów w porządku rosnącym. Poniższy kod placu zabaw pokazuje, jak używaćsorted()
:# 2. Sortuj według malejącej kolejności dla porównywalnych obiektów
Jeśli typ elementu w Twojej kolekcji jest zgodny
Comparable
protokołem, będziesz musiał użyć gosorted(by:)
, aby posortować elementy w porządku malejącym.# 3. Sortuj w kolejności rosnącej lub malejącej dla nieporównywalnych obiektów
Jeśli typ elementu w Twojej kolekcji NIE JEST zgodny z
Comparable
protokołem, będziesz musiał użyćsorted(by:)
, aby posortować elementy w porządku rosnącym lub malejącym.Zwróć uwagę, że Swift udostępnia również dwie metody o nazwie
sort()
isort(by:)
jako odpowiednikisorted()
isorted(by:)
jeśli musisz posortować swoją kolekcję na miejscu.źródło
W Swift 3.0
źródło
Możesz także zrobić coś takiego
więc tablica zdjęć będzie przechowywana jako posortowana
źródło
Szybko 2 do 4
Pierwotna odpowiedź próbowała posortować tablicę niestandardowych obiektów za pomocą jakiejś właściwości. Poniżej pokażę kilka przydatnych sposobów na wykonanie tego samego zachowania w / szybkich struktur danych!
Małe rzeczy na swojej drodze, nieznacznie zmieniłem ImageFile. Mając to na uwadze, tworzę tablicę z trzema plikami obrazów. Zauważ, że metadane są wartością opcjonalną, przekazując zero jako oczekiwany parametr.
ImageFile ma właściwość o nazwie size. W poniższych przykładach pokażę, jak używać operacji sortowania z właściwościami takimi jak rozmiar.
najmniejszy do największego rozmiaru (<)
od największego do najmniejszego (>)
Następnie posortujemy według nazwy właściwości String. W ten sam sposób użyj sortowania, aby porównać ciągi znaków. Ale zauważ, że wewnętrzny blok zwraca wynik porównania. Ten wynik zdefiniuje sortowanie.
AZ (.orderedAscending)
ZA (.orderedDescending)
Następny jest mój ulubiony sposób sortowania, w wielu przypadkach będzie miał opcjonalne właściwości. Teraz nie martw się, będziemy sortować w taki sam sposób jak powyżej, z tym wyjątkiem, że musimy zająć zero! W produkcji;
Użyłem tego kodu, aby wymusić na wszystkich instancjach w mojej tablicy zerowe wartości właściwości, aby były ostatnie. Następnie uporządkuj metadane przy użyciu założonych niezapakowanych wartości.
Możliwe jest dodatkowe sortowanie dla opcji. Na przykład; można wyświetlać obrazy z metadanymi i uporządkowane według rozmiaru.
źródło
Dwie alternatywy
1) Zamawianie oryginalnej tablicy za pomocą sortInPlace
2) Używanie alternatywnej tablicy do przechowywania uporządkowanej tablicy
źródło
var assignmentsO : [Assignment]
lub połączenie go w jedną linię za pomocąlet assignmentsO = self.assignments.sort({ $0.order < $1.order })
Swift 4.0, 4.1 i 4.2 Najpierw stworzyłem zmienną tablicę typu imageFile (), jak pokazano poniżej
Utwórz zmienny obraz obiektu typu imageFile () i przypisz wartość do właściwości, jak pokazano poniżej
Teraz dołącz ten obiekt do tablicy arr
Teraz przypisz różne właściwości do tego samego zmiennego obiektu, tj. Obrazu
Teraz ponownie dołącz obiekt obrazu do tablicy arr
Teraz będziemy stosować porządku rosnącym na fileid nieruchomości w tablicy obiektów Arr. Użyj <symbol dla porządku rosnącego
Teraz zastosujemy porządek malejący dla właściwości fileId w obiektach tablicowych. Użyj > symbolu dla porządku malejącego
W Swift 4.1. & 4.2 Do użytku posortowanego
źródło
Jeśli zamierzasz sortować tę tablicę w więcej niż jednym miejscu, sensowne może być uczynienie typu tablicy Porównywalnym.
źródło
Jeśli nie używasz niestandardowych obiektów, ale zamiast tego używasz typów wartości, które implementują protokół porównywalny (Int, String itp.), Możesz po prostu to zrobić:
Przykład:
źródło
myArray.sorted(by: >)
Zwrócono posortowaną tablicę z właściwości fileID w następujący sposób:
Swift 2
Szybki 3 LUB 4
Swift 5.0
źródło
Robię to w ten sposób i działa:
var images = [imageFile]() images.sorted(by: {$0.fileID.compare($1.fileID) == .orderedAscending })
źródło
Jeśli chcesz posortować oryginalną tablicę obiektów niestandardowych. Oto inny sposób, aby to zrobić w Swift 2.1
Gdzie
id
jest liczba całkowita. Tego samego<
operatora można również użyć doString
właściwości.Możesz dowiedzieć się więcej o jego wykorzystaniu, patrząc na przykład tutaj: Swift2: Pobliscy klienci
źródło
Wydruki:
"["Peter", "Kweku", "Kofi", "Akosua", "Abena"]"
źródło
Swift 3 oraz 4 i 5
Miałem pewien problem związany z małymi i dużymi literami
więc zrobiłem ten kod
a następnie użyj sortedImages po tym
źródło
Sortuj za pomocą KeyPath
możesz sortować według
KeyPath
tego:Wdrażając to mało pomocne rozszerzenie.
Hope Swift doda to w najbliższej przyszłości w rdzeniu języka.
źródło
public extension MutableCollection where Self: RandomAccessCollection { mutating func sort<T>(_ keyPath: KeyPath<Element, T>, by areInIncreasingOrder: (T, T) throws -> Bool) rethrows where T: Comparable { try sort { try areInIncreasingOrder($0[keyPath: keyPath], $1[keyPath: keyPath]) } }}