সুইফট: বর্ণানুক্রমিকভাবে বস্তুর অ্যারে বাছাই করুন


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)

ধন্যবাদ, আমি স্যুইফ্ট দিয়ে শুরু করছি, এবং ক্লোজারগুলির ব্যবহার সম্পর্কে আমি জানতাম না।
সিডিপালমার

1
চলচ্চিত্রের পরিবর্তে মুভি.সোর্টটি ব্যবহার করুন @সোর্টড @ মাইক এস
ওসকারিয়াগন

1
ব্যাখ্যার জন্য ধন্যবাদ। আমার সম্পাদনা উন্নত হয়েছে, ঠিক আছে উচিত, দয়া করে একবার দেখুন :)
জুলিয়ান ক্রোল

8
সাবধান, স্ট্রিং বাছাইয়ের সময় এটি কার্যকর হবে না যা মূলধনীয় হতে পারে বা নাও পারে। ইচ্ছের তুলনা করলে .lowercaseStringএই সমস্যার সমাধান হবে।
ম্যাথিউ রিগলার

2
@ এরিকআয়া নোট করুন এটি sortedআবার সুইফ্ট 3-এ রয়েছে: ডি।
ডিভিপি.পেট্রভ

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:​)একটি Movieশ্রেণীর সাথে ব্যবহার করাComparable

যাইহোক, আপনার 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()একটি 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]
 */

আরে, কিছু আছে কি? ২ য় থেকে ৩ য় এর মধ্যে (বাদে movies.sorted(by: <)এবং movies.sorted())?
কমলদীপ সিং ভাটিয়া

sorted(by:)এবং sorted()দুটি ভিন্ন পদ্ধতি। আপনি array.sorted()বিকল্প হিসাবে ব্যবহার করতে পারেন array.sorted(by: <)
ইমানো পেটিট

হ্যাঁ, কেবল শ্রেণির সংজ্ঞার ক্ষেত্রে জিজ্ঞাসা করে আমাদের কি কোনও পরিবর্তন করা দরকার? আমি বলতে চাচ্ছি, আমরা উভয় জন্য একই ক্লাসে সংজ্ঞা থাকতে পারে sorted(by:)এবং sorted()?
কমলদীপ সিং ভাটিয়া

1
হ্যাঁ, আপনি আপনার শ্রেণি / কাঠামোর একই প্রয়োগ করতে পারেন যা কোনও ক্ষেত্রেই Comparableপ্রোটোকলের সাথে মানিয়ে নিতে হয়।
ইমানু পেটিট

যখন আমি আরোহণে ক্রমবর্ধমান ক্রম এটি সঠিকভাবে সংক্ষিপ্ত না হয় shoer আমার কাস্টমবজেক্ট সঙ্গে অ্যারে আছে। "1" "14""28""31""4""42""49"
ক্রুনাল নাগবাদিয়া

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

দীর্ঘ সময় ধরে চেষ্টা করার পরে আমার জন্য কাজ করেছে। কেন আমি বুঝতে পারছি না, যেহেতু সমস্ত পাঠ্যটি শুরু করার সাথে ছোট করা হয়েছিল।
টম টালাক সলবু

যখন লোয়ারকেসড () ব্যবহার করা হবে তখন সমস্ত নামগুলি ছোট
কেসগুলিতে

14

যারা সুইফট 3 ব্যবহার করেন তাদের পক্ষে, গৃহীত উত্তরের সমতুল্য পদ্ধতি হ'ল:

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

1

সাজানো অ্যারে সুইফট ৪.২

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.