Swift: Sắp xếp mảng các đối tượng theo thứ tự abc


136

Tôi có cái này:

class Movies {
  Name:String
  Date:Int
}

và một mảng [Phim]. Làm thế nào để tôi sắp xếp các mảng theo thứ tự abc theo tên? Tôi đã thử:

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

movieArr = sorted(movieArr)

nhưng điều đó không hiệu quả vì tôi không truy cập thuộc tính tên của Phim.

Câu trả lời:


295

Trong bao đóng bạn chuyển đến sort, so sánh các thuộc tính bạn muốn sắp xếp theo. Như thế này:

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

hoặc sau đây trong các trường hợp mà bạn muốn bỏ qua các trường hợp:

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

Sidenote: Thông thường chỉ các loại bắt đầu bằng một chữ cái viết hoa; Tôi khuyên bạn nên sử dụng namedate, không NameDate.


Ví dụ, trong một sân chơi:

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 sẽ theo thứ tự [movieA, movieB, movieC]

Cập nhật Swift5

channelsArray = channelsArray.sorted { (channel1, channel2) -> Bool in
            let channelName1 = channel1.name
            let channelName2 = channel2.name
            return (channelName1.localizedCaseInsensitiveCompare(channelName2) == .orderedAscending)

Cảm ơn, tôi mới bắt đầu với Swift và tôi không biết về việc sử dụng các bao đóng.
cdpalmer

1
sử dụng movies.sort thay vì movies.sort @Mike S
Oskariagon 04/11/2015

1
cám ơn vì sự giải thích. Cải thiện bản chỉnh sửa của tôi, sẽ ổn thôi, vui lòng xem :)
Julian Król

8
Coi chừng, điều này sẽ không hoạt động khi sắp xếp chuỗi có thể hoặc không được viết hoa. So sánh .lowercaseStringsẽ giải quyết vấn đề này.
Matthieu Riegler

2
@EricAya Lưu ý rằng nó lại xuất hiện sortedtrong Swift 3: D.
dvp.petrov

44

Với Swift 3, bạn có thể chọn một trong những cách sau để giải quyết vấn đề của mình.


1. Sử dụng sorted(by:​)với một Movielớp không phù hợp với Comparablegiao thức

Nếu Movielớp của bạn không tuân thủ Comparablegiao thức, bạn phải chỉ định trong bao đóng thuộc tính mà bạn muốn sử dụng sorted(by:​)phương thức Array .

Movie khai báo lớp:

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
    }

}

Sử dụng:

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. Sử dụng sorted(by:​)với một Movielớp phù hợp với Comparablegiao thức

Tuy nhiên, bằng cách làm cho Movielớp của bạn tuân thủ Comparablegiao thức, bạn có thể có một mã ngắn gọn khi bạn muốn sử dụng sorted(by:​)phương thức của Array .

Movie khai báo lớp:

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
    }

}

Sử dụng:

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. Sử dụng sorted()với một Movielớp phù hợp với Comparablegiao thức

Bằng cách làm cho Movielớp của bạn tuân thủ Comparablegiao thức, bạn có thể sử dụng sorted()phương thức của Array để thay thế sorted(by:​).

Movie khai báo lớp:

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
    }

}

Sử dụng:

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]
 */

Này, có khác không. giữa 2 và 3 (trừ movies.sorted(by: <)movies.sorted())?
Kamaldeep singh Bhatia

sorted(by:)sorted()là hai phương pháp khác nhau. Bạn có thể sử dụng array.sorted()như là một thay thế cho array.sorted(by: <).
Imanou Petit

Có, chỉ cần hỏi trong trường hợp định nghĩa lớp chúng ta có cần thay đổi gì không? Ý tôi là, chúng ta có thể có cùng định nghĩa lớp cho cả hai sorted(by:)sorted()không?
Kamaldeep singh Bhatia

1
Có, bạn có thể có cùng cách triển khai lớp / struct của mình, trong mọi trường hợp, phải tuân thủ Comparablegiao thức.
Imanou Petit

Tôi có Array với customObject khi tôi shoer theo thứ tự tăng dần, nó không bị thiếu theo cách thích hợp. "1" "14""28""31""4""42""49"
Krunal Nagvadia

16
let sortArray =  array.sorted(by: { $0.name.lowercased() < $1.name.lowercased() })

thêm .lowercasing () làm việc cho tôi sau một thời gian dài cố gắng. Tôi không hiểu tại sao, vì tất cả các văn bản đã được hạ xuống để bắt đầu.
Tom Tallak Solbu 17/12/18

khi sử dụng lowcasing () sẽ thay đổi tất cả các tên thành chữ thường để được sắp xếp hợp lý :)
m.alqadi 18/12/18

14

Đối với những người sử dụng Swift 3, phương pháp tương đương cho câu trả lời được chấp nhận là:

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

1

Sắp xếp mảng Swift 4.2

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

0
*import Foundation
import CoreData


extension Messages {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Messages> {
        return NSFetchRequest<Messages>(entityName: "Messages")
    }

    @NSManaged public var text: String?
    @NSManaged public var date: Date?
    @NSManaged public var friends: Friends?

}

    //here arrMessage is the array you can sort this array as under bellow 

    var arrMessages = [Messages]()

    arrMessages.sort { (arrMessages1, arrMessages2) -> Bool in
               arrMessages1.date! > arrMessages2.date!
    }*
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.