Giới thiệu
Bài viết minh họa cách dùng phương thức String.contains() để kiểm tra chuỗi nhập vào EditText có chứa một chuỗi con cụ thể hay không (ví dụ: "tutorialspoint").
Các bước thực hiện
Bước 1: Tạo project mới
Android Studio → File → New Project → Empty Activity.
Bước 2: Giao diện (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:padding="16dp">
<EditText
android:id="@+id/etInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Nhập chuỗi (ví dụ: tutorialspoint is best)"
android:inputType="text" />
<Button
android:id="@+id/btnCheck"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Kiểm tra contains" />
<TextView
android:id="@+id/tvResult"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:textSize="18sp"
android:textStyle="bold" />
</LinearLayout>
Bước 3: Logic (MainActivity.kt)
package com.example.containsdemo
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btnCheck.setOnClickListener {
val input = etInput.text.toString()
if (input.isEmpty()) {
etInput.error = "Vui lòng nhập chuỗi"
return@setOnClickListener
}
val searchTerm = "tutorialspoint"
val contains = input.contains(searchTerm, ignoreCase = true) // Kotlin extension
tvResult.text = "contains(\"$searchTerm\"): $contains"
Toast.makeText(this, "Kết quả: $contains", Toast.LENGTH_LONG).show()
}
}
}
Giải thích contains()
input.contains("tutorialspoint"): Trả vềBoolean- true nếu tìm thấy chuỗi con.- Kotlin có overload
contains(other, ignoreCase = true)- rất tiện. - Java:
input.contains("tutorialspoint")(case-sensitive), hoặcinput.toLowerCase().contains("tutorialspoint").
So sánh các phương pháp tìm kiếm chuỗi
| Phương thức | Mục đích | Case-sensitive | Hiệu năng |
|---|---|---|---|
contains(substring) |
Có chứa substring? | Có (Java), Tùy chọn (Kotlin) | O(n*m) - đủ nhanh cho string ngắn |
startsWith(prefix) |
Bắt đầu bằng prefix? | Có | O(m) - nhanh hơn |
endsWith(suffix) |
Kết thúc bằng suffix? | Có | O(m) - nhanh hơn |
indexOf(substring) |
Vị trí đầu tiên của substring (-1 nếu không) | Có | O(n*m) - trả về index |
matches(regex) |
Khớp regex toàn chuỗi | Có | Chậm (compile regex) |
Regex.containsMatchIn() |
Regex search anywhere | Tùy pattern | Chậm |
Các trường hợp sử dụng thực tế
1. Validation email domain
val email = "user@company.com"
val isCompanyEmail = email.contains("@company.com", ignoreCase = true)
2. Filter list (Search)
val filtered = items.filter { it.name.contains(query, ignoreCase = true) }
3. Kiểm tra từ khóa nhạy cảm
val bannedWords = listOf("spam", "scam", "phishing")
val hasBanned = bannedWords.any { input.contains(it, ignoreCase = true) }
4. File extension check
val isImage = fileName.contains(".jpg", ignoreCase = true) ||
fileName.contains(".png", ignoreCase = true) ||
fileName.contains(".webp", ignoreCase = true)
// Hoặc tốt hơn:
val isImage = fileName.lowercase().let { it.endsWith(".jpg") || it.endsWith(".png") || it.endsWith(".webp") }
Lưu ý
contains("")luôn trả vềtrue.- Kotlin
ignoreCase = truedùng locale mặc định, có thể khác biệt cho tiếng Turk/Αζερbaycan. Dùngequals(..., ignoreCase = true)cho so sánh toàn chuỗi. - Với string rất lớn/lặp nhiều lần, cân nhắc
StringBuilderhoặc indexing (KMP, Boyer-Moore). - Null safety:
input?.contains(...)hoặcinput.orEmpty().contains(...).