Bài 18- Xử lý chuỗi trong Kotlin


Trong tất cả các ngôn ngữ lập trình thì Xử lý chuỗi vô cùng quan trọng, hầu như các dự án ta đều phải liên quan tới xử lý chuỗi.

Toàn bộ thông tin chi tiết về chuỗi trong Kotlin được trình bày tại đây https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/, các bạn có thời gian thì vào đó xem. Trong bài học này Tui sẽ trình bày một số hàm thường dùng nhất trong chuỗi.

Để khai báo chuỗi trong Kotlin ta dùng:

var s:String=”Obama”

hoặc

var s:String?=”Putin”

Một chuỗi trong Kotlin sẽ có các thuộc tính và phương thức sau(rất rất nhiều phương thức hữu ích, nhưng Tui chỉ có thể liệt kê một số mà thôi):

Tên Thuộc tính/

phương thức

Mô tả
length thuộc tính trả về chiều dài của chuỗi
indexOf(chuỗi) Trả về vị trí đầu tiên tìm thấy, không tìm thấy trả về -1
lastIndexOf(chuỗi) lastIndexOf trả về vị trí cuối cùng tìm thấy
contains(chuỗi con) Contains Kiểm tra chuỗi con có nằm trong chuỗi s?
subString(vt) Trích lọc toàn bộ bên phải chuỗi từ vt
subString(startIndex,endIndex) Trích lọc giữa chuỗi nằm giữa start tới end index
replace(chuỗi cũ, chuỗi mới) Đổi toàn bộ chuỗi cũ thành chuỗi mới
replaceFirst(chuỗi cũ, chuỗi mới) Đổi chuỗi cũ thành chuỗi mới nhưng chỉ áp dụng cho chuỗi cũ đầu tiên
trimStart xóa khoảng trắng dư thừa bên trái
trimEnd xóa khoảng trắng dư thừa bên phải
trim xóa khoảng trắng dư thừa bên trái và phải
compareTo(chuỗi s2)
So sánh 2 chuỗi có phân biệt chữ HOA và chữ thường

=0 khi s1=s2

>0 khi s1>s2

<0 khi s1<s2

compareTo(s2, ignoreCase = true) So sánh 2 chuỗi KHÔNG phân biệt chữ HOA và chữ thường

=0 khi s1=s2

>0 khi s1>s2

<0 khi s1<s2

 plus(chuỗi x)  Nối chuỗi x vào chuỗi gốc
 split(chuỗi tách)  Tách chuỗi gốc thành List<String>
 toUpperCase  Chuyển chuỗi thành IN HOA
 toLowerCase  Chuyển chuỗi thàh in thường

Bây giờ Tui đi vào từng hàm để các bạn dễ dàng thực hành về xử lý chuỗi:

  • Hàm IndexOf – trả về vị trí đầu tiên tìm thấy, nếu không thấy trả về -1:

/**
* Created by cafe on 28/05/2017.
*/
fun main(args: Array<String>) {
var s:String="Obama"
var i = 0
// Trả về i = 2
i = s.indexOf("a")
println(i)
}

Ta thấy rõ ràng ký tự/chuỗi a xuất hiện 2 lần, nhưng Kotlin chỉ quan tâm kết quả đầu tiên mà thôi, vì vậy kết quả =2 sẽ được xuất ra màn hình (vị trí bắt đầu tính từ 0).

  • lastIndexOf trả về vị trí cuối cùng tìm thấy, nếu không thấy trả về -1:

/**
* Created by cafe on 28/05/2017.
*/
fun main(args: Array<String>) {
var s: String = "Hello everybody !";
var i = 0;
// Trả về i = 8
i = s.lastIndexOf("e");
println(i)
}

Ta thấy kết quả xuất ra =8 là vị trí cuối cùng của ký tự/chuỗi e

  • Contains kiểm tra chuỗi con có tồn tại trong chuỗi gốc hay không, có thì trả về true, còn không trả về false

/**
* Created by cafe on 28/05/2017.
*/
fun main(args: Array<String>) {
var s :String  = "Hello everybody !"
var s2="body"
if(s.contains(s2))
{
println("Có tồn tại [$s2]")
}
else
{
println("Ko tồn tại [$s2]")
}
}

Kết quả chạy ta thấy xuất “Có tồn tại [body]”. Hàm contains được sử dụng rất nhiều để kiểm tra sự tồn tại của chuỗi con.

  • subString – trích lọc chuỗi

/**
* Created by cafe on 28/05/2017.
*/
fun main(args: Array<String>) {
val s = "Xin chào Obama! Tui là Putin"
val s2 = s.substring(9)
println(s2)
val s3 = s.substring(9, 14)
println(s3)
}

Kết quả khi chạy ta thấy:

Obama! Tui là Putin
Obama

Muốn trích lọc bên phải chuỗi thì dùng substring với 1 đối số, muốn trích lọc giữa chuỗi thì dùng 2 đối số.

  • replace – đổi chuỗi cũ thành chuỗi mới

/**
* Created by cafe on 28/05/2017.
*/
fun main(args: Array<String>) {
var s = "Xin chào Obama! Tui là Putin"
s = s.replace("Obama", "Kim Jong Un")
println(s)
}

Kết quả khi chạy ta thấy:

Xin chào Kim Jong Un! Tui là Putin
  • replaceFirst-Đổi chuỗi cũ thành chuỗi mới nhưng chỉ áp dụng cho chuỗi đầu tiên tìm thấy

/**
* Created by cafe on 28/05/2017.
*/
fun main(args: Array<String>) {
var s = "Obama Xin chào Michelle Obama"
s = s.replaceFirst("Obama", "Putin")
println(s)
}

Kết quả khi chạy ta thấy:

Putin Xin chào Michelle Obama

Mặc dù chuỗi gốc ta có 2 chuỗi con Obama, nhưng chương trình chỉ áp dụng cho Obama đầu tiên

  • Các hàm xóa khoảng trắng: trim,trimEnd,trimStart

/**
* Created by cafe on 28/05/2017.
*/
fun main(args: Array<String>) {
var s:String= "    Trần Duy Thanh      "
val s2=s.trimStart()
println(s2+"=>size="+s2.length)
val s3=s.trimEnd()
println(s3+"=>size="+s3.length)
val s4=s.trim()
println(s4+"=>size="+s4.length)

}

Kết quả khi chạy ta thấy:

Trần Duy Thanh      =>size=20
Trần Duy Thanh=>size=18
Trần Duy Thanh=>size=14
  • compareTo – so sánh chuỗi

/**
* Created by cafe on 28/05/2017.
*/
fun main(args: Array<String>) {
val s1 = "Hạnh phúc"
val s2 = "Hạnh PHÚC"
val x = s1.compareTo(s2, ignoreCase = true)
println(x)
val y = s1.compareTo(s2, ignoreCase = false)
println(y)
}/**
* Created by cafe on 28/05/2017.
*/
fun main(args: Array<String>) {
val s1 = "Hạnh phúc"
val s2 = "Hạnh PHÚC"
val x = s1.compareTo(s2, ignoreCase = true)
println(x)
val y = s1.compareTo(s2, ignoreCase = false)
println(y)
}

Kết quả khi chạy ta thấy:

0
32

Ta thấy nếu so sánh không phân biệt chữ Hoa – thường(ignoreCase = true) thì kết quả =0, còn có phân biệt chữ HOA – thường(ignoreCase = false) thì kết quả >1 (32)

  • plus– nối chuỗi

/**
* Created by cafe on 28/05/2017.
*/
fun main(args: Array<String>) {
var s:String="Obama"
s=s.plus(" ")
s=s.plus("Putin")
println(s)
}

Kết quả khi chạy ta thấy:

Obama Putin

Hàm plus ở trên nối chuỗi nhưng nó không làm thay đổi chuỗi gốc mà nó trả về 1 chuỗi mới do đó ta phải lưu lại địa chỉ mới này. Ta có thể dùng dấu + (nhưng không nên dùng khi nối chuỗi quá nhiều đặc biệt đọc từ file hay internet), Ngoài ra có thể dùng StringBuilder để xử lý nối chuỗi.

  • split– tách chuỗi theo tiêu chí bất kỳ, trả về một List<String>

/**
* Created by cafe on 28/05/2017.
*/
fun main(args: Array<String>) {
var s:String="Trần Duy Thanh"
var arr:List<String> = s.split(" ")
println("Số phần tử="+arr.size)
for(x in arr)
println(x)
}

Kết quả khi chạy ta thấy:

Số phần tử=3
Trần
Duy
Thanh

Hàm tách chuỗi rất quan trọng, vì hầu như ta đều gặp trong quá trình viết phần mềm. Input là 1 chuỗi có quy luật, và ta phải phân tích để tách chuỗi rồi mô hình hóa thành dữ liệu có cấu trúc(thường là OOP)

  • toUpperCase, toLowerCase để chuyển CHỮ HOA, chữ thường

/**
* Created by cafe on 28/05/2017.
*/
fun main(args: Array<String>) {
var s:String="Trần Duy Thanh"
var s2=s.toUpperCase()
println(s2)
var s3=s.toLowerCase()
println(s3)
}

Kết quả khi chạy ta thấy:

TRẦN DUY THANH
trần duy thanh

Bây giờ Tui thử làm một chương trình tối ưu chuỗi:

Cho một chuỗi bất kỳ, hãy tối ưu chuỗi theo mô tả: Chuỗi không có khoảng trắng dư thừa, các từ cách nhau bởi 1 khoảng trắng, ký tự đầu của các từ viết HOA

Ví dụ:

Input: “  TRẦN       duY       THAnh  ”

Output: “Trần Duy Thanh”


/**
* Created by cafe on 28/05/2017.
*/
fun toiUU(s: String): String {
var sToiTuu = s
sToiTuu = sToiTuu.trim()
val arrWord = sToiTuu.split(" ");
sToiTuu = ""
for (word in arrWord) {
var newWord = word.toLowerCase()
if (newWord.length > 0) {
newWord = newWord.replaceFirst((newWord[0] + ""), (newWord[0] + "").toUpperCase())
sToiTuu += newWord + " "
}
}
return sToiTuu.trim()
}
fun main(args: Array<String>) {
var s = "   TRẦN         dUY     THanh   "
println(s)
var sToiUuu = toiUU(s)
println(sToiUuu)

s = "     NguyễN      VĂN  OBAMA   "
println(s)
sToiUuu = toiUU(s)
println(sToiUuu)
}

Kết quả khi chạy ta thấy:

   TRẦN         dUY     THanh
Trần Duy Thanh
NguyễN      VĂN  OBAMA
Nguyễn Văn Obama

Như vậy tới đây Tui đã hướng dẫn xong cách xử lý chuỗi trong Kotlin, các bạn chú ý học kỹ và hiểu được nó thông qua các ví dụ ở trên nhé. Cần thành thạo các thư viện để có thể áp dụng tốt vào các dự án thực tế của mình.

Cần phải đọc nhiều ví dụ về cách xử lý chuỗi từ Kotlin, vì trong bài này Tui mới liệt kê được một số phương thức thường dùng mà thôi, nó còn vô vàn các phương thức khác rất hữu ích

Các bạn có thể tải source code bài này ở đây: http://www.mediafire.com/file/v62acsqhh101jp8/XuLyChuoi.rar

Hẹn gặp các bạn ở những bài tiếp theo

Chúc các bạn thành công!

Trần Duy Thanh (http://ssoftinc.com/)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: