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?

28voto

jaiswal Rajan Punkte 4641

In Swift 3.0

images.sort(by: { (erstes: imageFile, zweites: imageFile) -> Bool in
    erstes. fileID < zweites. fileID
})

22voto

Nicolas Grenié Punkte 5822

Sie können auch etwas Ähnliches tun

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

damit Ihr Bilder-Array sortiert gespeichert wird

22voto

Gurjinder Singh Punkte 7152

Swift 4.0, 4.1 & 4.2:

Zunächst habe ich ein veränderliches Array vom Typ imageFile erstellt, wie unten gezeigt:

var arr = [imageFile]()

Erstellen Sie ein veränderliches Objekt Bild vom Typ imageFile und weisen Sie den Eigenschaften wie unten gezeigt Werte zu:

var image = imageFile()
image.fileId = 14
image.fileName = "A"

Fügen Sie nun dieses Objekt dem Array arr hinzu

arr.append(image)

Weisen Sie nun den verschiedenen Eigenschaften das gleiche veränderliche Objekt d.h. image zu

image = imageFile()
image.fileId = 13
image.fileName = "B"

Fügen Sie nun erneut das Bildobjekt dem Array arr hinzu

arr.append(image)

Wenden wir jetzt die aufsteigende Reihenfolge auf die fileId Eigenschaft in den Objekten des Arrays arr an. Verwenden Sie das < Symbol für die aufsteigende Reihenfolge

arr = arr.sorted(by: {$0.fileId < $1.fileId}) // arr hat alle Objekte in aufsteigender Reihenfolge
print("sortiertes Array ist",arr[0].fileId)// sortiertes Array ist 13
print("sortiertes Array ist",arr[1].fileId)//sortiertes Array ist 14

Wenden wir jetzt die absteigende Reihenfolge auf die fileId Eigenschaft in den Objekten des Arrays arr an. Verwenden Sie das > Symbol für die absteigende Reihenfolge

arr = arr.sorted(by: {$0.fileId > $1.fileId}) // arr hat alle Objekte in absteigender Reihenfolge
print("Unsortiertes Array ist",arr[0].fileId)// Unsortiertes Array ist 14
print("Unsortiertes Array ist",arr[1].fileId)// Unsortiertes Array ist 13

In Swift 4.1 & 4.2, für sortierte Reihenfolge verwenden Sie

let sortedArr = arr.sorted { (id1, id2) -> Bool in
  return id1.fileId < id2.fileId // Verwenden Sie > für absteigende Reihenfolge
}

20voto

jnblanchard Punkte 1122

Swift 2 bis 4

Die ursprüngliche Antwort suchte nach einer Möglichkeit, ein Array von benutzerdefinierten Objekten nach einer Eigenschaft zu sortieren. Nachfolgend zeige ich Ihnen ein paar praktische Möglichkeiten, um dieses Verhalten mit Swift-Datenstrukturen zu erreichen!

Zuerst einmal habe ich ImageFile ein klein wenig geändert. In diesem Sinne erstelle ich ein Array mit drei Bilddateien. Beachten Sie, dass metadata ein optionaler Wert ist und das Eingeben von nil als Parameter erwartet wird.

 struct ImageFile {
      var name: String
      var metadata: String?
      var size: Int
    }

    var images: [ImageFile] = [ImageFile(name: "HalloWelt", metadata: nil, size: 256), ImageFile(name: "Reisende Verkäufer", metadata: "ähm, das ist riesig", size: 1024), ImageFile(name: "Slack", metadata: "was ist da drin?", size: 2048) ]

ImageFile hat eine Eigenschaft namens size. Für die folgenden Beispiele werde ich Ihnen zeigen, wie Sie Sortieroperationen mit Eigenschaften wie size durchführen können.

Kleinste bis größte Größe (<)

    let sizeKleinstsortiert = images.sorted { (initial, next) -> Bool in
      return initial.size < next.size
    }

Größte bis kleinste Größe (>)

    let sizeGrößtsortiert = images.sorted { (initial, next) -> Bool in
      return initial.size > next.size
    }

Anschließend werden wir nach der String-Eigenschaft name sortieren. Genauso wie bei den Zahlen verwenden Sie sort, um Strings zu vergleichen. Beachten Sie jedoch, dass der innere Block ein Vergleichsergebnis zurückgibt. Dieses Ergebnis wird die Sortierung definieren.

A-Z (.orderedAscending)

    let nameAufsteigendsortiert = images.sorted { (initial, next) -> Bool in
      return initial.name.compare(next.name) == .orderedAscending
    }

Z-A (.orderedDescending)

    let nameAbsteigendsortiert = images.sorted { (initial, next) -> Bool in
      return initial.name.compare(next.name) == .orderedDescending
    }

Als nächstes folgt meine bevorzugte Art der Sortierung. In vielen Fällen können optionale Eigenschaften vorhanden sein. Keine Sorge, wir werden genauso wie oben sortieren, außer dass wir mit Nil umgehen müssen! In der Produktion;

Ich habe diesen Code verwendet, um alle Instanzen in meinem Array mit Nil-Werteigenschaften ganz nach hinten zu drängen. Anschließend wird metadata unter Verwendung der angenommenen ausgepackten Werte sortiert.

    let metadataZuerst = images.sorted { (initial, next) -> Bool in
      guard initial.metadata != nil else { return true }
      guard next.metadata != nil else { return true }
      return initial.metadata!.compare(next.metadata!) == .orderedAscending
    }

Es ist möglich, eine sekundäre Sortierung für Optionale durchzuführen. Zum Beispiel könnten Bilder mit Metadaten angezeigt und nach Größe sortiert werden.

19voto

Bernauer Punkte 729

Zwei Alternativen

1) Sortieren des Originalarrays mit sortInPlace

self.assignments.sortInPlace({ $0.order < $1.order })
self.printAssignments(assignments)

2) Verwendung eines Alternativarrays zum Speichern des sortierten Arrays

var assignmentsO = [Aufgabe] ()
assignmentsO = self.assignments.sort({ $0.order < $1.order })
self.printAssignments(assignmentsO)

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