Comparable และการเรียงลำดับ
กำหนดลำดับด้วย < เพื่อใช้เรียงข้อมูล
Comparable และการเรียงลำดับ เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
Comparable คืออะไร
Comparable ทำให้ชนิดข้อมูลมีตัวดำเนินการสำหรับการจัดลำดับ ได้แก่ <, <=, >, >= การทำให้สอดคล้องกับโปรโตคอลนี้ช่วยให้คุณเรียกใช้ sorted(), min() และ max() ได้โดยตรง
การทำให้สอดคล้องด้วย <
คุณต้องนำ < ไปใช้งานเพียงตัวเดียว ส่วนที่เหลือจะถูกสร้างขึ้นโดยอัตโนมัติ (และยังต้องใช้ Equatable ด้วย)
struct Version: Comparable {
let major: Int
static func < (l: Version, r: Version) -> Bool { l.major < r.major }
}
print(Version(major: 1) < Version(major: 2)) // trueการเรียงลำดับชนิดข้อมูล Comparable
เมื่อเป็น Comparable แล้ว sorted() ก็ไม่ต้องรับคลอเชอร์:
struct Score: Comparable {
let points: Int
static func < (l: Score, r: Score) -> Bool { l.points < r.points }
}
let sorted = [Score(points: 3), Score(points: 1), Score(points: 2)].sorted()
print(sorted.map { $0.points }) // [1, 2, 3]ใช้ min และ max ได้ทันที
Comparable ยังทำให้ใช้ตัวช่วยสำหรับค่ารวมได้ด้วย:
struct Temp: Comparable {
let c: Int
static func < (l: Temp, r: Temp) -> Bool { l.c < r.c }
}
let temps = [Temp(c: 20), Temp(c: 5), Temp(c: 30)]
print(temps.min()!.c, temps.max()!.c) // 5 30การจัดลำดับด้วยหลายคีย์
หากต้องตัดสินลำดับเมื่อหลายฟิลด์มีค่าเท่ากัน ให้เปรียบเทียบฟิลด์ต่าง ๆ ตามลำดับความสำคัญภายใน < โดยใช้ทูเพิล เพราะ Swift เปรียบเทียบทูเพิลตามลำดับพจนานุกรม
เทคนิคการเปรียบเทียบทูเพิล
เปรียบเทียบด้วยนามสกุลก่อน แล้วจึงเปรียบเทียบด้วยชื่อ:
struct Person: Comparable {
let last: String
let first: String
static func < (l: Person, r: Person) -> Bool {
(l.last, l.first) < (r.last, r.first)
}
}
let p = [Person(last: "Lee", first: "Bo"), Person(last: "Lee", first: "An")].sorted()
print(p.map { $0.first }) // ["An", "Bo"]การเรียงลำดับโดยไม่ใช้ Comparable
คุณสามารถเรียงลำดับด้วยคลอเชอร์ต่อท้ายได้เสมอ แม้ว่าชนิดข้อมูลนั้นจะไม่เป็น Comparable:
struct Item { let name: String; let qty: Int }
let items = [Item(name: "B", qty: 2), Item(name: "A", qty: 5)]
let byQty = items.sorted { $0.qty > $1.qty }
print(byQty.map { $0.name }) // ["A", "B"]การเรียงลำดับจากมากไปน้อย
กลับทิศทางการเปรียบเทียบ หรือเรียกใช้ .reversed():
let nums = [3, 1, 4, 1, 5]
print(nums.sorted(by: >)) // [5, 4, 3, 1, 1]
print(nums.sorted().reversed()) // [5, 4, 3, 1, 1]sorted กับ sort
sorted() ส่งคืนอาร์เรย์ใหม่ ส่วน sort() แก้ไขอาร์เรย์เดิมโดยตรง (จึงต้องประกาศด้วย var):
var nums = [3, 1, 2]
nums.sort()
print(nums) // [1, 2, 3]
let copy = [3, 1, 2].sorted()
print(copy) // [1, 2, 3]การเรียงลำดับที่เสถียรเพียงพอ
การเรียงลำดับของ Swift รับประกันว่าเสถียรมาตั้งแต่ Swift 5: สมาชิกที่เท่ากันจะคงลำดับสัมพัทธ์เดิมไว้ คุณจึงใช้คุณสมบัตินี้กับการเรียงลำดับหลายรอบที่ต้องการผลลัพธ์คาดเดาได้:
let words = ["bb", "a", "cc", "d"]
let byLen = words.sorted { $0.count < $1.count }
print(byLen) // ["a", "d", "bb", "cc"] -- "a" before "d", "bb" before "cc"การเรียงลำดับด้วยเส้นทางคีย์
คุณสามารถเรียงลำดับด้วยคลอเชอร์ที่อ่านคุณสมบัติใดก็ได้ โดยไม่ต้องทำให้ชนิดข้อมูลทั้งชนิดสอดคล้องกับโปรโตคอล:
struct Player { let name: String; let score: Int }
let players = [Player(name: "A", score: 30), Player(name: "B", score: 50)]
let ranked = players.sorted { $0.score > $1.score }
print(ranked.map { $0.name }) // ["B", "A"]ตรวจสอบความเข้าใจอย่างรวดเร็ว
คุณต้องนำตัวดำเนินการเพียงตัวใดไปใช้งานเพื่อให้สอดคล้องกับ Comparable?
สรุป
คุณได้เรียนรู้เกี่ยวกับ Comparable:
Comparableมีตัวดำเนินการสำหรับการจัดลำดับ โดยนำ<ไปใช้งานเพียงตัวเดียว- ทำให้ใช้
sorted(),min()และmax()ได้โดยไม่ต้องใช้คลอเชอร์ - การเปรียบเทียบทูเพิลช่วยจัดลำดับด้วยหลายคีย์ได้ง่าย
sorted()ส่งคืนค่าใหม่ ส่วนsort()แก้ไขค่าเดิม และการเรียงลำดับมีความเสถียร
ถัดไป: ความหมายของการเท่ากันแบบกำหนดเอง
คำถามที่พบบ่อย
บทเรียน “Comparable และการเรียงลำดับ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “Comparable และการเรียงลำดับ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “Comparable และการเรียงลำดับ”
กำหนดลำดับด้วย < เพื่อใช้เรียงข้อมูล คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “Comparable และการเรียงลำดับ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม
ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Equatable ที่สังเคราะห์อัตโนมัติ
- Hashable และ hash(into:)
- Comparable และการเรียงลำดับ
- ความหมายความเท่ากันแบบกำหนดเอง