스위프트 : 알파벳 순서로 객체 배열 정렬


137

나는 이것을 가지고있다:

class Movies {
  Name:String
  Date:Int
}

그리고 [영화]의 배열. 이름순으로 배열을 알파벳순으로 정렬하려면 어떻게합니까? 난 노력 했어:

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

movieArr = sorted(movieArr)

영화의 이름 속성에 액세스하지 않기 때문에 작동하지 않습니다.

답변:


297

에 전달할 클로저 sort에서 정렬하려는 속성을 비교하십시오. 이처럼 :

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

또는 사례를 우회하려는 경우 다음을 수행하십시오.

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

주석 : 일반적으로 유형 만 대문자로 시작합니다. 내가 사용하는 것이 좋습니다 것 name하고 date,하지 NameDate.


예를 들어 놀이터에서 :

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 순서대로 될 것이다 [movieA, movieB, movieC]

Swift5 업데이트

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

고마워, 나는 Swift로 시작했고 클로저 사용에 대해 몰랐다.
cdpalmer 2018 년

1
사용 대신 movies.sorted @ 마이크 S의 movies.sort
Oskariagon

1
설명 주셔서 감사합니다. 내 편집 개선, 벌금을해야한다,보고 :)하시기 바랍니다
줄리안 크롤

8
대문자로 표시되거나 대문자로 표시되지 않는 문자열을 정렬 할 때는 작동하지 않습니다. 를 비교하면 .lowercaseString이 문제가 해결됩니다.
Matthieu Riegler

2
@EricAya sortedSwift 3에 다시 있습니다 : D.
dvp.petrov

44

Swift 3에서는 다음 방법 중 하나를 선택하여 문제를 해결할 수 있습니다.


1. 프로토콜을 준수하지 않는 클래스 sorted(by:​)와 함께 사용MovieComparable

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
    }

}

용법:

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. 프로토콜 을 준수 sorted(by:​)하는 Movie클래스 와 함께 사용Comparable

그러나 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
    }

}

용법:

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. 프로토콜 을 준수 sorted()하는 Movie클래스 와 함께 사용Comparable

당신함으로써 Movie클래스에 부합 Comparable프로토콜, 당신은 배열의 사용 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
    }

}

용법:

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

이봐, 차이가 있니? 2와 3 사이 ( movies.sorted(by: <)와 제외 movies.sorted())?
Kamaldeep singh Bhatia

sorted(by:)sorted()두 가지 방법이있다. array.sorted()의 대안으로 사용할 수 있습니다 array.sorted(by: <).
Imanou Petit

예, 클래스 정의의 경우 물어 보면 아무것도 변경해야합니까? 내 말은, sorted(by:)그리고 둘 다에 대해 동일한 클래스 정의를 가질 수 sorted()있습니까?
Kamaldeep 싱 Bhatia

1
예, 어쨌든 Comparable프로토콜 을 준수 해야하는 동일한 클래스 / 구조체 구현을 가질 수 있습니다 .
Imanou Petit

오름차순으로 정렬 할 때 customObject가있는 배열이 있는데 적절한 방법으로 단락되지 않습니다. "1" "14""28""31""4""42""49"
Krunal Nagvadia

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

.lowercased () 추가하면 오랜 시간 동안 노력한 후에 저에게 효과적이었습니다. 모든 텍스트가 소문자로 시작했기 때문에 이유를 이해할 수 없습니다.
Tom Tallak Solbu

사용 소문자로 할 때 () : 제대로 분류를 소문자로 모든 이름이 변경됩니다
m.alqadi

14

Swift 3을 사용하는 경우 허용되는 답변에 해당하는 방법은 다음과 같습니다.

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

1

정렬 된 배열 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!
    }*
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.