0Pricing
Swift Academy · บทเรียน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. Equatable ที่สังเคราะห์อัตโนมัติ
  2. Hashable และ hash(into:)
  3. Comparable และการเรียงลำดับ
  4. ความหมายความเท่ากันแบบกำหนดเอง
← กลับไปที่ Swift Academy