654 Stimmen

Wie man ein Array von benutzerdefinierten Objekten nach dem Wert einer Eigenschaft in Swift sortiert

Sagen wir, wir haben eine benutzerdefinierte Klasse namens imageFile und diese Klasse enthält zwei Eigenschaften:

class imageFile  {
    var fileName = String()
    var fileID = Int()
}

Viele von ihnen sind in einem Array gespeichert:

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)

Wie kann ich das Bilderarray nach 'fileID' in aufsteigender oder absteigender Reihenfolge sortieren?

1136voto

Alex Wayne Punkte 160481

Zunächst deklarieren Sie Ihr Array als Typ-Array, damit Sie Methoden aufrufen können, wenn Sie iterieren:

var images: [imageFile] = []

Dann können Sie einfach tun:

Swift 2

images.sorted({ $0.fileID > $1.fileID })

Swift 3

images.sorted(by: { $0.fileID > $1.fileID })

Swift 5

images.sorted { $0.fileId > $1.fileID }

Das obige Beispiel liefert die Ergebnisse in absteigender Reihenfolge.

282voto

GoZoner Punkte 63309

[Aktualisiert für Swift 3 mit sort(by:)] Dies nutzt eine abschließende Closure aus:

images.sorted { $0.fileID < $1.fileID }

wo du < oder > je nach ASC oder DESC verwenden kannst. Wenn du das images Array ändern möchtest, dann verwende das Folgende:

images.sort { $0.fileID < $1.fileID }

Wenn du dies wiederholt tun möchtest und es bevorzugst, eine Funktion zu definieren, ist eine Möglichkeit:

func sorterForFileIDASC(this:imageFile, that:imageFile) -> Bool {
  return this.fileID < that.fileID
}

und dann verwenden als:

images.sort(by: sorterForFileIDASC)

64voto

Imanou Petit Punkte 83480

Mit Swift 5 hat Array zwei Methoden namens sorted() und sorted(by:). Die erste Methode, sorted(), hat die folgende Deklaration:

Gibt die Elemente der Sammlung sortiert zurück.

func sorted() -> [Element]

Die zweite Methode, sorted(by:), hat die folgende Deklaration:

Gibt die Elemente der Sammlung sortiert zurück, wobei das gegebene Prädikat als Vergleich zwischen den Elementen verwendet wird.

func sorted(by areInIncreasingOrder: (Element, Element) throws -> Bool) rethrows -> [Element]

1. Sortieren mit aufsteigender Reihenfolge für vergleichbare Objekte

=====================================================================

Wenn der Elementtyp innerhalb Ihrer Sammlung dem Protokoll Comparable entspricht, können Sie sorted() verwenden, um Ihre Elemente in aufsteigender Reihenfolge zu sortieren. Der folgende Playground-Code zeigt, wie man sorted() verwendet:

class ImageFile: CustomStringConvertible, Comparable {

    let fileName: String
    let fileID: Int
    var description: String { return "ImageFile mit ID: \(fileID)" }

    init(fileName: String, fileID: Int) {
        self.fileName = fileName
        self.fileID = fileID
    }

    static func ==(lhs: ImageFile, rhs: ImageFile) -> Bool {
        return lhs.fileID == rhs.fileID
    }

    static func <(lhs: ImageFile, rhs: ImageFile) -> Bool {
        return lhs.fileID < rhs.fileID
    }

}

let images = [
    ImageFile(fileName: "Auto", fileID: 300),
    ImageFile(fileName: "Boot", fileID: 100),
    ImageFile(fileName: "Flugzeug", fileID: 200)
]

let sortedImages = images.sorted()
print(sortedImages)

/*
 gibt aus: [ImageFile mit ID: 100, ImageFile mit ID: 200, ImageFile mit ID: 300]
 */

2. Sortieren mit absteigender Reihenfolge für vergleichbare Objekte

====================================================================

Wenn der Elementtyp innerhalb Ihrer Sammlung dem Protokoll Comparable entspricht, müssen Sie sorted(by:) verwenden, um Ihre Elemente in absteigender Reihenfolge zu sortieren.

class ImageFile: CustomStringConvertible, Comparable {

    let fileName: String
    let fileID: Int
    var description: String { return "ImageFile mit ID: \(fileID)" }

    init(fileName: String, fileID: Int) {
        self.fileName = fileName
        self.fileID = fileID
    }

    static func ==(lhs: ImageFile, rhs: ImageFile) -> Bool {
        return lhs.fileID == rhs.fileID
    }

    static func <(lhs: ImageFile, rhs: ImageFile) -> Bool {
        return lhs.fileID < rhs.fileID
    }

}

let images = [
    ImageFile(fileName: "Auto", fileID: 300),
    ImageFile(fileName: "Boot", fileID: 100),
    ImageFile(fileName: "Flugzeug", fileID: 200)
]

let sortedImages = images.sorted(by: { (img0: ImageFile, img1: ImageFile) -> Bool in
    return img0 > img1
})
//let sortedImages = images.sorted(by: >) // funktioniert auch
//let sortedImages = images.sorted { $0 > $1 } // funktioniert auch
print(sortedImages)

/*
 gibt aus: [ImageFile mit ID: 300, ImageFile mit ID: 200, ImageFile mit ID: 100]
 */

3. Sortieren mit aufsteigender oder absteigender Reihenfolge für nicht vergleichbare Objekte

=============================================================================================

Wenn der Elementtyp innerhalb Ihrer Sammlung dem Protokoll Comparable NICHT entspricht, müssen Sie sorted(by:) verwenden, um Ihre Elemente in aufsteigender oder absteigender Reihenfolge zu sortieren.

class ImageFile: CustomStringConvertible {

    let fileName: String
    let fileID: Int
    var description: String { return "ImageFile mit ID: \(fileID)" }

    init(fileName: String, fileID: Int) {
        self.fileName = fileName
        self.fileID = fileID
    }

}

let images = [
    ImageFile(fileName: "Auto", fileID: 300),
    ImageFile(fileName: "Boot", fileID: 100),
    ImageFile(fileName: "Flugzeug", fileID: 200)
]

let sortedImages = images.sorted(by: { (img0: ImageFile, img1: ImageFile) -> Bool in
    return img0.fileID < img1.fileID
})
//let sortedImages = images.sorted { $0.fileID < $1.fileID } // funktioniert auch
print(sortedImages)

/*
 gibt aus: [ImageFile mit ID: 300, ImageFile mit ID: 200, ImageFile mit ID: 100]
 */

Beachten Sie, dass Swift auch zwei Methoden namens sort() und sort(by:) als Gegenstücke von sorted() und sorted(by:) bereitstellt, wenn Sie Ihre Sammlung direkt sortieren müssen.

64voto

quemeful Punkte 8788

Swift 3

people = people.sorted(by: { $0.email > $1.email })

Swift 3

people = people.sorted(by: { $0.email > $1.email })

59voto

fujianjin6471 Punkte 5028

Fast jeder gibt wie direkt, lass mich die Entwicklung zeigen:

Sie können die Instanzmethoden von Array verwenden:

// Allgemeine Form von Closure
images.sortInPlace({ (image1: imageFile, image2: imageFile) -> Bool in return image1.fileID > image2.fileID })

// Die Typen der Parameter und der Rückgabewert des Closure können von Swift abgeleitet werden, daher werden sie zusammen mit dem Rückgabepfeil (->) weggelassen
images.sortInPlace({ image1, image2 in return image1.fileID > image2.fileID })

// Closures mit nur einem Ausdruck können implizit das Ergebnis ihres einzigen Ausdrucks zurückgeben, indem das Schlüsselwort "return" weggelassen wird
images.sortInPlace({ image1, image2 in image1.fileID > image2.fileID })

// Die Argumentenliste des Closure zusammen mit dem Schlüsselwort "in" kann weggelassen werden, $0, $1, $2, und so weiter werden verwendet, um auf die ersten, zweiten, dritten Argumente des Closure usw. zu verweisen
images.sortInPlace({ $0.fileID > $1.fileID })

// Die Vereinfachung des Closure ist gleich
images = images.sort({ (image1: imageFile, image2: imageFile) -> Bool in return image1.fileID > image2.fileID })
images = images.sort({ image1, image2 in return image1.fileID > image2.fileID })
images = images.sort({ image1, image2 in image1.fileID > image2.fileID })
images = images.sort({ $0.fileID > $1.fileID })

Für eine ausführliche Erklärung über das Funktionsprinzip von sort, siehe Die Funktion Sortieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X