स्विफ्ट: वर्णों की क्रमबद्ध वर्णमाला


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, नहीं Nameऔर Date


एक खेल के मैदान में उदाहरण:

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]

स्विफ्ट 5 अपडेट

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

धन्यवाद, मैं बस स्विफ्ट के साथ शुरू कर रहा हूं, और मुझे क्लोजर के उपयोग के बारे में नहीं पता था।
cdpalmer

1
फिल्मों के बजाय मूवीज का उपयोग करें। Serse @Mike S
Oskariagon

1
समझाने के लिए धन्यवाद। मेरे संपादन में सुधार, ठीक होना चाहिए, कृपया एक नज़र डालें :)
जूलियन क्राल

8
खबरदार, यह तब काम नहीं करेगा जब स्ट्रिंग को छाँटा जाए जो पूंजीकृत हो या न हो। .lowercaseStringवसीयत की तुलना करने से यह समस्या दूर हो जाएगी।
मथिउ रीगलर

2
@EricAya नोट यह sortedस्विफ्ट 3 में फिर से है: डी।
DVp.petrov

44

स्विफ्ट 3 के साथ, आप अपनी समस्या को हल करने के लिए निम्न तरीकों में से एक चुन सकते हैं।


1. sorted(by:​)एक ऐसे Movieवर्ग के साथ प्रयोग करना जो Comparableप्रोटोकॉल के अनुरूप नहीं है

यदि आपकी Movieकक्षा Comparableप्रोटोकॉल के अनुरूप नहीं है, तो आपको अपनी संपत्ति को बंद करना होगा, जिस पर आप ऐरे की 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:​)साथ प्रयोग करनाMovieComparable

हालाँकि, अपनी Movieकक्षा को Comparableप्रोटोकॉल के अनुरूप बनाकर , जब आप ऐरे की 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()साथ प्रयोग करनाMovieComparable

अपनी 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()?
कमलदीप सिंह भाटिया

sorted(by:)और sorted()दो अलग-अलग विधियां हैं। आप array.sorted()विकल्प के रूप में उपयोग कर सकते हैं array.sorted(by: <)
इमानौ पेटिट

हां, कक्षा की परिभाषा के मामले में पूछने पर क्या हमें कुछ बदलने की जरूरत है? मेरा मतलब है, क्या हम दोनों के लिए एक ही वर्ग परिभाषा हो सकती है sorted(by:)और sorted()?
कमलदीप सिंह भाटिया

1
हां, आपकी कक्षा / संरचना का वही कार्यान्वयन हो सकता है, जो किसी भी स्थिति में, Comparableप्रोटोकॉल के अनुरूप होना चाहिए ।
इमानौ पेटिट

जब मैं आरोही क्रम में थरथराता हूं तो मुझे कस्टमऑबजेक्ट के साथ एरियर मिलता है। "1" "14""28""31""4""42""49"
क्रुणाल नागवडिय़ा

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

जोड़ने की कोशिश की लंबी अवधि के बाद .lowered () मेरे लिए काम किया। मुझे समझ में नहीं आता है, क्योंकि सभी पाठ के साथ शुरू करने के लिए उतारा गया था।
टॉम तल्क सोलु

जब निचले स्तर का उपयोग करें () सभी नामों को निचली स्थिति में ठीक से हल करने के लिए बदल देगा :)
m.alqadi

14

स्विफ्ट 3 का उपयोग करने वालों के लिए, स्वीकृत उत्तर के लिए समकक्ष विधि है:

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

1

क्रमबद्ध सरणी स्विफ्ट 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!
    }*
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.