web-dev-qa-db-fra.com

Swift: Trier le tableau d'objets par ordre alphabétique

J'ai ceci:

class Movies {
  Name:String
  Date:Int
}

et un tableau de [Films]. Comment trier le tableau alphabétiquement par nom? J'ai essayé:

movieArr = movieArr.sorted{ $0 < $1 }

et

movieArr = sorted(movieArr)

mais cela ne fonctionne pas parce que je n'ai pas accès à l'attribut name de Movies.

117
Jonah Ruffer

Dans la fermeture que vous passez à sort, comparez les propriétés que vous souhaitez trier. Comme ça:

movieArr.sorted { $0.name < $1.name }

ou les éléments suivants dans les cas où vous souhaitez contourner les cas:

movieArr.sorted { $0.name.lowercased() < $1.name.lowercased() }

Sidenote: Typiquement, seuls les types commencent par une lettre majuscule; Je recommanderais d'utiliser name et date, et non Name et Date.


Exemple, dans une aire de jeux:

class Movie {
    let name: String
    var date: Int?

    init(_ name: String) {
        self.name = name
    }
}

var movieA = Movie("A")
var movieB = Movie("B")
var movieC = Movie("C")

let movies = [movieB, movieC, movieA]
let sortedMovies = movies.sorted { $0.name < $1.name }
sortedMovies

sortedMovies sera dans l'ordre [movieA, movieB, movieC]

241
Mike S

Avec Swift 3, vous pouvez choisir l’un des moyens suivants pour résoudre votre problème.


1. Utilisation de sorted(by:​) avec une classe Movie non conforme au protocole Comparable

Si votre classe Movie n'est pas conforme au protocole Comparable, vous devez spécifier dans votre clôture la propriété sur laquelle vous souhaitez utiliser la méthode sorted(by:​) de Array.

Movie déclaration de classe:

import Foundation

class Movie: CustomStringConvertible {

    let name: String
    var date: Date
    var description: String { return name }

    init(name: String, date: Date = Date()) {
        self.name = name
        self.date = date
    }

}

Usage:

let avatarMovie = Movie(name: "Avatar")
let titanicMovie = Movie(name: "Titanic")
let piranhaMovie = Movie(name: "Piranha II: The Spawning")

let movies = [avatarMovie, titanicMovie, piranhaMovie]
let sortedMovies = movies.sorted(by: { $0.name < $1.name })
// let sortedMovies = movies.sorted { $0.name < $1.name } // also works

print(sortedMovies)

/*
prints: [Avatar, Piranha II: The Spawning, Titanic]
*/

2. Utilisation de sorted(by:​) avec une classe Movie conforme au protocole Comparable

Cependant, en rendant votre classe Movie conforme au protocole Comparable, vous pouvez avoir un code beaucoup plus concis lorsque vous souhaitez utiliser la méthode sorted(by:​) de Array.

Movie déclaration de classe:

import Foundation

class Movie: CustomStringConvertible, Comparable {

    let name: String
    var date: Date
    var description: String { return name }

    init(name: String, date: Date = Date()) {
        self.name = name
        self.date = date
    }

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

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

}

Usage:

let avatarMovie = Movie(name: "Avatar")
let titanicMovie = Movie(name: "Titanic")
let piranhaMovie = Movie(name: "Piranha II: The Spawning")

let movies = [avatarMovie, titanicMovie, piranhaMovie]
let sortedMovies = movies.sorted(by: { $0 < $1 })
// let sortedMovies = movies.sorted { $0 < $1 } // also works
// let sortedMovies = movies.sorted(by: <) // also works

print(sortedMovies)

/*
 prints: [Avatar, Piranha II: The Spawning, Titanic]
 */

3. Utilisation de sorted() avec une classe Movie conforme au protocole Comparable

En rendant votre classe Movie conforme au protocole Comparable, vous pouvez utiliser la méthode sorted() de Array au lieu de sorted(by:​).

Movie déclaration de classe:

import Foundation

class Movie: CustomStringConvertible, Comparable {

    let name: String
    var date: Date
    var description: String { return name }

    init(name: String, date: Date = Date()) {
        self.name = name
        self.date = date
    }

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

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

}

Usage:

let avatarMovie = Movie(name: "Avatar")
let titanicMovie = Movie(name: "Titanic")
let piranhaMovie = Movie(name: "Piranha II: The Spawning")

let movies = [avatarMovie, titanicMovie, piranhaMovie]
let sortedMovies = movies.sorted()

print(sortedMovies)

/*
 prints: [Avatar, Piranha II: The Spawning, Titanic]
 */
41
Imanou Petit
let sortArray =  array.sorted(by: { $0.name.lowercased() < $1.name.lowercased() })
14
m.alqadi

Pour ceux qui utilisent Swift 3, la méthode équivalente pour la réponse acceptée est la suivante:

movieArr.sorted { $0.Name < $1.Name }
13
Jacobo Koenig

Tableau trié Swift 4.2

arrayOfRaces = arrayOfItems.sorted(by: { ($0["raceName"] as! String) < ($1["raceName"] as! String) })
0
CSE 1994