Kotlin Là Gì?
Kotlin Là Gì?

Cấu trúc dữ liệu với Kotlin: Kỹ năng cần biết

Nội dung bài học

Kotlin cung cấp cho Lập trình viên trọn bộ tất cả những Cấu trúc dữ liệu cần dùng cho 1 chương trình. Hãy cùng mình khám phá các loại cấu trúc dữ liệu đó.

Array, String

Array, String là dạng cấu trúc dữ liệu phổ biến trong các logic của chương trình Kotlin. Chúng ta thường dùng chúng để lưu trữ dữ liệu dạng Text, Number hoặc là Object.

Tham khảo cách sử dụng Array theo ví dụ code bên dưới

fun main() {
    // Ngoài ra còn có thể sử dụng FloatArray, DoubleArray, LongArray, ShortArray, ByteArray, CharArray, BooleanArray
    val simpleIntegerArrayV1: IntArray = intArrayOf(1, 2, 3, 4, 5)
    simpleIntegerArrayV1[0] = 10

    // Hoặc chỉ cần sử dụng arrayOf
    val simpleIntegerArrayV2: Array<Int> = arrayOf(1, 2, 3, 4, 5)
    val simpleIntegerArrayV3: Array<Int> = Array(5) { i -> i + 1 }
    val simpleIntegerArrayV4: Array<Int> = Array(5) { it + 1 }
    val simpleIntegerArrayV5 = simpleIntegerArrayV4 + simpleIntegerArrayV3
    val simpleIntegerArrayWithNullable: Array<Int?> = arrayOf(1, 2, 3, 4, 5, null)

    simpleIntegerArrayV2.forEach {
        println(it)
    }
    simpleIntegerArrayV2.forEachIndexed { index, i ->
        println("Index: $index, Value: $i")
    }
    println(simpleIntegerArrayV5.joinTo(StringBuilder(), separator = ", ", prefix = "[", postfix = "]"))
}

Một số ứng dụng của Array trong chương trình thực tế: Lưu trạng thái của 1 đối tượng; Lưu lịch sử thay đổi; Cache dữ liệu chưa xử lý; ,,,

fun main() {
    val greeting = "Hello"
    val completeGreeting = "$greeting, Kotlin!"
    println(completeGreeting)

    // String Interpolation
    val name = "DanTech0xFF"
    println("Hello, $name!")

    // Multiline Strings
    val text = """
        This is a multiline string.
        It spans multiple lines.
        """
    println(text)

    // String Length
    val textLength = "Hello, Kotlin Programming!"
    println("Length of the string is ${textLength.length}")

    // String to Int Conversion
    val numberString = "123"
    val number = numberString.toInt()
    println(number + 1)

    // String Comparison
    val text1 = "Hello"
    val text2 = "hello"
    println(text1.equals(text2, ignoreCase = true))

    // Substring
    val substringText = "Hello, World!"
    println(substringText.substring(0, 5))

    // Replace
    val replaceText = "Hello, Kotlin!"
    println(replaceText.replace("Kotlin", "Kotlin Programming"))
}

Một số ứng dụng của String trong chương trình:

  • Lưu nội dung JSON, Database Query, File Content …
  • Cache nội dung của các View hiển thị Text

List, Stack, Queue

Tham khảo cách sử dụng List trong Kotlin theo ví dụ code bên dưới

fun main() {
    val numbers: List<Int> = listOf(1, 2, 3, 4, 5)
    println(numbers[0]) // Output: 1
    println(numbers[1]) // Output: 2
    println(numbers.size) // Output: 5
    println(numbers.contains(3)) // Output: true
    println(numbers.indexOf(4)) // Output: 3
    println(numbers.lastIndexOf(5)) // Output: 4
    println(numbers.subList(1, 4)) // Output: [2, 3, 4]
    println(numbers.isNotEmpty())

    val mutableNumbers = mutableListOf(1, 2, 3, 4, 5) // numbers.toMutableList()
    mutableNumbers.add(6)
    mutableNumbers.removeAt(0)
    mutableNumbers[1] = 10
    println(mutableNumbers) // Output: [2, 10, 3, 4, 5, 6]
}

Tham khảo cách sử dụng Stack, Queue theo code ví dụ bên dưới

fun main() {
    // Deque is a double-ended queue that supports adding and removing elements from both ends
    // support both mechanisms of stack and queue
    val deque = ArrayDeque<Int>()

    // Adding elements to the deque
    deque.addFirst(1)
    deque.addLast(2)
    deque.addFirst(3)
    deque.addLast(4)

    println("Deque after adding elements: $deque")

    // Removing elements from the deque
    val removedFirst = deque.removeFirst()
    val removedLast = deque.removeLast()

    println("Removed first element: $removedFirst")
    println("Removed last element: $removedLast")
    println("Deque after removing elements: $deque")

    // Iterating over the elements
    println("Iterating over the elements:")
    for (element in deque) {
        println(element)
    }

    // Checking if deque contains a specific element
    val containsThree = deque.contains(3)
    println("Deque contains 3: $containsThree")

    // Getting the size of the deque
    val size = deque.size
    println("Size of the deque: $size")

    // Checking if the deque is empty
    val isEmpty = deque.isEmpty()
    println("Is deque empty: $isEmpty")

    // Clearing the deque
    deque.clear()
    println("Deque after clearing: $deque")
}

Map, Set

Tham khảo cách khai báo và sử dụng các loại Map trong Kotlin theo code ví dụ bên dưới

fun main() {
    val hashMap = mapOf(
        "key1" to "value1",
        "key2" to "value2",
        "key3" to "value3"
    ) // Immutable Map
    val mutableHashMap = mutableMapOf(
        "key1" to "value1",
        "key2" to "value2",
        "key3" to "value3"
    ) // Mutable Map
    val emptyHashMap = hashMapOf<String, String>() // Mutable empty HashMap
    val manualHashMap: HashMap<String, String> = HashMap() // Mutable empty HashMap
    val immutableHashMap: Map<String, String> = HashMap() // Immutable empty HashMap
}
  • MapMutableMap là interface để biểu thị cho tính Mutability của Map
  • HashMap là một Implementation của MutableMap
  • Ngoài HashMap ta còn có thể sử dụng các Implementation khác của MutableMap ví dụ: LinkedHashMap

Tương tự như Map và MutableMap, List và MutableList -> chúng ta có Set và MutableSet trong Kotlin.

fun main() {
    val hashSet = setOf("value1", "value2", "value3") // Immutable Set
    val mutableHashSet = mutableSetOf("value1", "value2", "value3") // Mutable Set
    val emptyHashSet = hashSetOf<String>() // Mutable empty HashSet
    val manualHashSet: HashSet<String> = HashSet() // Mutable empty HashSet
    val immutableHashSet: Set<String> = HashSet() // Immutable empty HashSet
}

Qua các ví dụ và kiến thức bên trên ta có thể thấy Kotlin là một ngôn ngữ rất chặt chẽ về mặt cú pháp thông quan việc phân định rõ Mutable và Immutable. Chính vì vậy trong quá trình làm việc bạn sẽ tránh được nhiều sai sót không đáng có do việc thay đổi, cập nhật dữ liệu không đúng nơi.