একাধিক মানদণ্ডের তুলনা করতে টিপলস ব্যবহার করা
(এবং যদি সমতুল্য, তারপর অন্য তুলনার অর্থাত শ্রেণীবিভাজন এক তুলনার,) কেমন একাধিক মানদণ্ডের দ্বারা করণ সত্যিই সহজ উপায় ব্যবহার করা tuples , যেমন <এবং >অপারেটরদের তাদের জন্য overloads যে lexicographic তুলনা সঞ্চালন আছে।
public func < <A : Comparable, B : Comparable>(lhs: (A, B), rhs: (A, B)) -> Bool
উদাহরণ স্বরূপ:
struct Contact {
var firstName: String
var lastName: String
}
var contacts = [
Contact(firstName: "Leonard", lastName: "Charleson"),
Contact(firstName: "Michael", lastName: "Webb"),
Contact(firstName: "Charles", lastName: "Alexson"),
Contact(firstName: "Michael", lastName: "Elexson"),
Contact(firstName: "Alex", lastName: "Elexson"),
]
contacts.sort {
($0.lastName, $0.firstName) <
($1.lastName, $1.firstName)
}
print(contacts)
এটি lastNameপ্রথমে উপাদানগুলির বৈশিষ্ট্যগুলির তুলনা করবে । যদি তারা সমান না হয়, তবে বাছাই <ক্রমটি তাদের সাথে তুলনার ভিত্তিতে হবে । তারা যদি হয় সমান, তাহলে এটি tuple উপাদানের পরবর্তী যুগল সম্মুখের সরানো, তুলনা অর্থাৎ করবে firstNameবৈশিষ্ট্য।
মান লাইব্রেরি উপলব্ধ <এবং >2 6 উপাদানের tuples জন্য overloads।
আপনি যদি বিভিন্ন বৈশিষ্ট্যের জন্য আলাদা বাছাইয়ের আদেশ চান তবে আপনি কেবলমাত্র টিপলগুলিতে উপাদানগুলি অদলবদল করতে পারেন:
contacts.sort {
($1.lastName, $0.firstName) <
($0.lastName, $1.firstName)
}
এটি এখন lastNameঅবতরণ করে সাজানো হবে, তারপরে firstNameআরোহণ।
sort(by:)একাধিক পূর্বাভাস নেয় এমন ওভারলোডের সংজ্ঞা দেওয়া হচ্ছে
ক্লোজার এবং সোর্টডিসিপেক্টরগুলির সাথে সংগ্রহগুলি mapবাছাইয়ের আলোচনায় অনুপ্রাণিত হয়ে আরেকটি বিকল্প হ'ল একটি কাস্টম ওভারলোডের সংজ্ঞা দেওয়া sort(by:)এবং sorted(by:)এটি একাধিক ভবিষ্যদ্বাণীগুলির সাথে ডিল করে - যেখানে প্রতিটি ভবিষ্যদ্বাণীকে উপাদানগুলির ক্রম সিদ্ধান্ত নেওয়ার পরিবর্তে বিবেচনা করা হয়।
extension MutableCollection where Self : RandomAccessCollection {
mutating func sort(
by firstPredicate: (Element, Element) -> Bool,
_ secondPredicate: (Element, Element) -> Bool,
_ otherPredicates: ((Element, Element) -> Bool)...
) {
sort(by:) { lhs, rhs in
if firstPredicate(lhs, rhs) { return true }
if firstPredicate(rhs, lhs) { return false }
if secondPredicate(lhs, rhs) { return true }
if secondPredicate(rhs, lhs) { return false }
for predicate in otherPredicates {
if predicate(lhs, rhs) { return true }
if predicate(rhs, lhs) { return false }
}
return false
}
}
}
extension Sequence {
mutating func sorted(
by firstPredicate: (Element, Element) -> Bool,
_ secondPredicate: (Element, Element) -> Bool,
_ otherPredicates: ((Element, Element) -> Bool)...
) -> [Element] {
return sorted(by:) { lhs, rhs in
if firstPredicate(lhs, rhs) { return true }
if firstPredicate(rhs, lhs) { return false }
if secondPredicate(lhs, rhs) { return true }
if secondPredicate(rhs, lhs) { return false }
for predicate in otherPredicates {
if predicate(lhs, rhs) { return true }
if predicate(rhs, lhs) { return false }
}
return false
}
}
}
( secondPredicate:প্যারামিটারটি দুর্ভাগ্যজনক, তবে বিদ্যমান sort(by:)ওভারলোডের সাথে অস্পষ্টতা তৈরি এড়াতে প্রয়োজনীয় )
এটি তখন আমাদের বলতে দেয় ( contactsআগের থেকে অ্যারে ব্যবহার করে ):
contacts.sort(by:
{ $0.lastName > $1.lastName },
{ $0.firstName < $1.firstName }
)
print(contacts)
let sortedContacts = contacts.sorted(by:
{ $0.lastName > $1.lastName },
{ $0.firstName < $1.firstName }
)
যদিও কল-সাইট টিউপল বৈকল্পিকের মতো সংক্ষিপ্ত নয়, আপনি কী তুলনা করছেন এবং কোন ক্রমে অতিরিক্ত স্পষ্টতা অর্জন করেছেন।
অনুসারে Comparable
আপনি যদি নিয়মিত এই ধরণের তুলনা নিয়মিত করে যাচ্ছেন তবে @ এমমচিলভ এবং @ অ্যাপজিউয়ারলাইফের পরামর্শ অনুসারে, আপনি এটি মেনে চলতে Contactপারেন Comparable:
extension Contact : Comparable {
static func == (lhs: Contact, rhs: Contact) -> Bool {
return (lhs.firstName, lhs.lastName) ==
(rhs.firstName, rhs.lastName)
}
static func < (lhs: Contact, rhs: Contact) -> Bool {
return (lhs.lastName, lhs.firstName) <
(rhs.lastName, rhs.firstName)
}
}
এবং এখন কেবল sort()একটি আরোহণের আদেশের জন্য কল করুন :
contacts.sort()
বা sort(by: >)একটি উতরাই অর্ডার জন্য:
contacts.sort(by: >)
নেস্টেড প্রকারে কাস্টম সাজানোর অর্ডারগুলি সংজ্ঞায়িত করা হচ্ছে
আপনি যদি চান এমন অন্য ধরণের অর্ডারগুলি ব্যবহার করতে চান তবে আপনি সেগুলি নেস্টেড টাইপের মধ্যে সংজ্ঞায়িত করতে পারেন:
extension Contact {
enum Comparison {
static let firstLastAscending: (Contact, Contact) -> Bool = {
return ($0.firstName, $0.lastName) <
($1.firstName, $1.lastName)
}
}
}
এবং তারপরে কেবল এটিকে কল করুন:
contacts.sort(by: Contact.Comparison.firstLastAscending)