Swift:按字母顺序排列对象数组

Jon*_*fer 121 arrays sorting ios swift

我有这个:

class Movies {
  Name:String
  Date:Int
}
Run Code Online (Sandbox Code Playgroud)

还有一组[电影].如何按名称按字母顺序对数组进行排序?我试过了:

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

movieArr = sorted(movieArr)

但这不起作用,因为我没有访问电影的名称属性.

Mik*_*e S 253

在传递给的闭包中sort,比较要排序的属性.像这样:

movieArr.sorted { $0.name < $1.name }
Run Code Online (Sandbox Code Playgroud)

旁注:通常只有类型以大写字母开头; 我建议使用nameand date,而不是NameDate.


例如,在操场上:

movieArr.sorted { $0.name.lowercased() < $1.name.lowercased() }
Run Code Online (Sandbox Code Playgroud)

sortedMovies 将在订单中 [movieA, movieB, movieC]

  • 请注意,排序可能会或可能不会大写的字符串时,这将不起作用.比较`.lowercaseString`将解决这个问题. (8认同)
  • @EricAya请注意,它再次在Swift 3中被“排序”:D。 (2认同)

Ima*_*tit 42

使用Swift 3,您可以选择以下方法之一来解决您的问题.


1.使用sorted(by:?)具有Movie不符合类Comparable的协议

如果您的Movie类不符合Comparable协议,则必须在闭包中指定您希望使用Array sorted(by:?)方法的属性.

Movie 类声明:

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
    }

}
Run Code Online (Sandbox Code Playgroud)

用法:

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]
*/
Run Code Online (Sandbox Code Playgroud)

2.使用符合协议sorted(by:?)MovieComparable

但是,通过使您的Movie类符合Comparable协议,当您想要使用Array的sorted(by:?)方法时,您可以拥有一个非常简洁的代码.

Movie 类声明:

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
    }

}
Run Code Online (Sandbox Code Playgroud)

用法:

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]
 */
Run Code Online (Sandbox Code Playgroud)

3.使用符合协议sorted()MovieComparable

通过使您的Movie类符合Comparable协议,您可以使用Array的sorted()方法作为替代sorted(by:?).

Movie 类声明:

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
    }

}
Run Code Online (Sandbox Code Playgroud)

用法:

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]
 */
Run Code Online (Sandbox Code Playgroud)


m.a*_*adi 14

let sortArray =  array.sorted(by: { $0.name.lowercased() < $1.name.lowercased() })
Run Code Online (Sandbox Code Playgroud)


Jac*_*nig 13

对于那些使用Swift 3的人来说,接受答案的等效方法是:

movieArr.sorted { $0.Name < $1.Name }
Run Code Online (Sandbox Code Playgroud)