⚖️ Toán tử Quan hệ/So sánh
🎯 Mục tiêu: Nắm vững các toán tử so sánh trong Kotlin - nền tảng cho điều kiện và logic.
💡 Tổng quan
Phần tiêu đề “💡 Tổng quan”Toán tử so sánh dùng để so sánh hai giá trị, kết quả luôn là Boolean (true hoặc false).
| Toán tử | Ý nghĩa | Ví dụ | Kết quả |
|---|---|---|---|
== |
Bằng | 5 == 5 |
true |
!= |
Khác | 5 != 3 |
true |
> |
Lớn hơn | 5 > 3 |
true |
< |
Nhỏ hơn | 3 < 5 |
true |
>= |
Lớn hơn hoặc bằng | 5 >= 5 |
true |
<= |
Nhỏ hơn hoặc bằng | 3 <= 3 |
true |
val a = 10val b = 5
println(a == b) // falseprintln(a != b) // trueprintln(a > b) // trueprintln(a >= 10) // true📝 So sánh số
Phần tiêu đề “📝 So sánh số”val x = 10val y = 20
println(x < y) // trueprintln(x > y) // falseprintln(x == 10) // trueprintln(y != 20) // falseSo sánh với các kiểu số khác nhau
Phần tiêu đề “So sánh với các kiểu số khác nhau”val intVal = 10val longVal = 10Lval doubleVal = 10.0
// So sánh giá trị, tự động convertprintln(intVal == longVal.toInt()) // trueprintln(intVal.toDouble() == doubleVal) // true
// Cẩn thận với floating point!println(0.1 + 0.2 == 0.3) // false! (do precision)🔤 So sánh String
Phần tiêu đề “🔤 So sánh String”Structural Equality (==)
Phần tiêu đề “Structural Equality (==)”So sánh nội dung:
val s1 = "Kotlin"val s2 = "Kotlin"val s3 = "kotlin"
println(s1 == s2) // true (cùng nội dung)println(s1 == s3) // false (khác case)
// Không phân biệt hoa/thườngprintln(s1.equals(s3, ignoreCase = true)) // trueReferential Equality (===)
Phần tiêu đề “Referential Equality (===)”So sánh reference (cùng object trong memory):
val a = "Kotlin"val b = "Kotlin"val c = String("Kotlin".toCharArray())
println(a == b) // true (cùng nội dung)println(a === b) // true (cùng reference - string pool)println(a === c) // false (khác reference)📊 So sánh với compareTo
Phần tiêu đề “📊 So sánh với compareTo”compareTo() trả về:
- Số âm: Nhỏ hơn
- 0: Bằng
- Số dương: Lớn hơn
val a = "apple"val b = "banana"
println(a.compareTo(b)) // -1 (a < b theo alphabet)println(a < b) // trueprintln(a > b) // false🎯 Toán tử in - Kiểm tra phạm vi
Phần tiêu đề “🎯 Toán tử in - Kiểm tra phạm vi”val age = 25
// Kiểm tra trong rangeprintln(age in 18..65) // true (18 <= age <= 65)println(age !in 0..17) // true (không trong 0-17)
// Với collectionsval fruits = listOf("apple", "banana", "orange")println("apple" in fruits) // trueprintln("mango" in fruits) // false⚖️ So sánh Objects
Phần tiêu đề “⚖️ So sánh Objects”Data class - tự động implement equals
Phần tiêu đề “Data class - tự động implement equals”data class User(val name: String, val age: Int)
val user1 = User("Alice", 25)val user2 = User("Alice", 25)val user3 = User("Bob", 30)
println(user1 == user2) // true (cùng giá trị)println(user1 === user2) // false (khác reference)println(user1 == user3) // falseRegular class - so sánh reference mặc định
Phần tiêu đề “Regular class - so sánh reference mặc định”class Person(val name: String)
val p1 = Person("Alice")val p2 = Person("Alice")
println(p1 == p2) // false! (khác reference)println(p1 === p2) // false🔍 Comparable interface
Phần tiêu đề “🔍 Comparable interface”Implement Comparable để dùng với <, >, etc:
data class Product(val name: String, val price: Double) : Comparable<Product> { override fun compareTo(other: Product): Int { return this.price.compareTo(other.price) }}
fun main() { val phone = Product("Phone", 15000000.0) val laptop = Product("Laptop", 25000000.0)
println(phone < laptop) // true println(phone > laptop) // false println(phone == laptop) // false}🛠️ Thực hành
Phần tiêu đề “🛠️ Thực hành”Bài tập 1: Kiểm tra điều kiện đăng ký
fun main() { val age = 17 val hasParentConsent = true
// TODO: In ra có được đăng ký không // Điều kiện: >= 18 tuổi HOẶC < 18 có sự đồng ý của phụ huynh}Lời giải:
fun main() { val age = 17 val hasParentConsent = true
val canRegister = age >= 18 || (age < 18 && hasParentConsent)
println("Tuổi: $age") println("Có đồng ý của phụ huynh: $hasParentConsent") println("Được đăng ký: $canRegister") // true}Bài tập 2: So sánh điểm
fun main() { val scores = listOf(85, 92, 78, 65, 98) val passingScore = 75
// TODO: Đếm số lượng đạt và không đạt}Lời giải:
fun main() { val scores = listOf(85, 92, 78, 65, 98) val passingScore = 75
val passed = scores.count { it >= passingScore } val failed = scores.count { it < passingScore }
println("Đạt: $passed") // 4 println("Không đạt: $failed") // 1}Bài tập 3: Xếp loại học lực
fun main() { val score = 85.5
// TODO: Xếp loại: // >= 90: Xuất sắc // >= 80: Giỏi // >= 70: Khá // >= 50: Trung bình // < 50: Yếu}Lời giải:
fun main() { val score = 85.5
val grade = when { score >= 90 -> "Xuất sắc" score >= 80 -> "Giỏi" score >= 70 -> "Khá" score >= 50 -> "Trung bình" else -> "Yếu" }
println("Điểm: $score - Xếp loại: $grade") // Output: Điểm: 85.5 - Xếp loại: Giỏi}📱 Trong Android
Phần tiêu đề “📱 Trong Android”// Kiểm tra API levelif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // Sử dụng feature cho Android 8.0+}
// So sánh versionsval currentVersion = "2.1.0"val minVersion = "2.0.0"if (currentVersion >= minVersion) { // OK để tiếp tục}
// Filter listval users = listOf( User("Alice", 25), User("Bob", 17), User("Charlie", 30))val adults = users.filter { it.age >= 18 }⚠️ Lưu ý quan trọng
Phần tiêu đề “⚠️ Lưu ý quan trọng”✅ Checklist - Tự kiểm tra
Phần tiêu đề “✅ Checklist - Tự kiểm tra”Sau bài học này, bạn có thể:
- Sử dụng 6 toán tử so sánh:
==,!=,<,>,<=,>= - Phân biệt
==(structural equality) và===(referential equality) - So sánh String không phân biệt hoa/thường với
equals(ignoreCase = true) - Sử dụng
inđể kiểm tra phạm vi - Implement
Comparablecho custom class - Cẩn thận khi so sánh floating-point numbers
Tiếp theo: Cấu trúc rẽ nhánh (if-else)