Khóa học
Bạn cũng có thể quan tâm đến các hướng dẫn sau:
Giới thiệu
Cấu trúc danh sách liên kết đơn, triển khai một danh sách với 3 phần tử số nguyên (Nguồn: Wikipedia - List (abstract data type)).
Nói chung, danh sách là một dãy các kiểu dữ liệu trừu tượng đại diện cho một số lượng giá trị cố định. Các giá trị có thể được thao tác bằng chương trình và cũng có thể xuất hiện nhiều hơn một lần trong một danh sách. Một ví dụ về danh sách được minh họa ở hình trên dưới dạng danh sách liên kết đơn gồm ba giá trị số nguyên. Danh sách cũng được xem là một cấu trúc dữ liệu, và một ví dụ như vậy của danh sách dưới dạng cấu trúc dữ liệu là danh sách liên kết.
Nhiều ngôn ngữ lập trình hỗ trợ danh sách, và một ví dụ nơi mọi người sử dụng danh sách rất nhiều là Python. Một danh sách thường có thể được tạo bằng cách viết các phần tử theo thứ tự, ngăn cách bằng dấu phẩy, chấm phẩy hoặc khoảng trắng, trong một cặp ký tự bao như ngoặc tròn (), ngoặc vuông [], ngoặc nhọn {}, hoặc ngoặc nhọn nhọn <>. Một số ngôn ngữ như Python có thể cho phép kiểu danh sách được đánh chỉ mục hoặc cắt lát giống như kiểu mảng; trong trường hợp đó kiểu dữ liệu được mô tả chính xác hơn là một mảng (Nguồn: Wikipedia - List (abstract data type)).
Riêng với Scala, danh sách là một collection chứa dữ liệu immutable, nghĩa là khi danh sách đã được tạo thì không thể thay đổi. Trong Scala, danh sách thể hiện một danh sách liên kết.
Trong danh sách Scala, mỗi phần tử không nhất thiết phải cùng kiểu dữ liệu. Việc triển khai danh sách Scala sử dụng trạng thái có thể thay đổi nội bộ trong giai đoạn khởi tạo. Trong Scala, danh sách được định nghĩa trong gói scala.collection.immutable và do đó chúng là bất biến. Cuối cùng, Scala List có nhiều phương thức như add, prepend, max, min, v.v.
Cú pháp định nghĩa một Scala List
val variable_name: List[type] = List(item1, item2, item3) hoặc val variable_name = List(item1, item2, item3) Một danh sách trong Scala nhìn chung giống một mảng Scala. Tuy nhiên, Scala List là bất biến và đại diện cho cấu trúc dữ liệu danh sách liên kết. Ngược lại, mảng Scala là phẳng và có thể thay đổi.
Hãy nhanh chóng hiểu sự khác biệt trên bằng một ví dụ.
Scala List so với Scala Array
Trước tiên, hãy định nghĩa một mảng trong Scala.
Sau đó bạn sẽ sửa đổi giá trị tại chỉ mục thứ 1 vì mảng Scala đánh chỉ mục từ 0 và xem liệu bạn có thể cập nhật nó không.

Như bạn có thể thấy từ đoạn mã trên, mảng Scala cho phép bạn sửa đổi giá trị tại chỉ mục thứ 1.
Bây giờ, bạn sẽ định nghĩa một Scala List và thử làm tương tự như trên.

Từ ví dụ trên, bạn có thể kết luận rằng vì Scala List là bất biến, việc cập nhật giá trị đã dẫn đến lỗi.
Các phương thức của Scala List
-
head: Trả về phần tử đầu tiên của danh sách Scala.
-
tail: Trả về tất cả phần tử ngoại trừ phần tử đầu tiên.
-
isEmpty: Kiểm tra xem danh sách có rỗng hay không; nếu rỗng trả về True, ngược lại trả về False.
-
fill(): Tạo một danh sách đồng nhất gồm không hoặc nhiều bản sao của phần tử được chỉ định.
-
reverse: Đảo ngược các phần tử của danh sách.
-
$:::$ hoặc $.:::$ hoặc .concat(): Nối hai hoặc nhiều danh sách.
-
tabulate(): Có thể lập bảng một danh sách. Về tinh thần, nó giống phương thức
fill(), nhưng khác ở chỗ nó nhận hai đối số. Đối số thứ nhất cho biết kích thước danh sách cần tạo, trong khi đối số thứ hai mô tả các phần tử của danh sách, được tính từ một hàm.
Đừng lo nếu một số phương thức trên chưa rõ ràng với bạn, vì bạn sẽ triển khai chúng trong Scala với ví dụ minh họa; nhưng trước đó hãy học cách định nghĩa Scala List.
Bạn sẽ tạo Scala List với các kiểu dữ liệu chuỗi, số nguyên (cả 1D & 2D). Bạn cũng sẽ học cách tạo một danh sách gồm cả chuỗi và số nguyên.
Danh sách số nguyên 1-D

Danh sách 1-D gồm cả số nguyên và chuỗi

Danh sách chuỗi 1-D

Danh sách 2-D

Phép toán số học trên danh sách
Trong ví dụ này, bạn sẽ sử dụng danh sách thay vì chỉ định nghĩa biến. Không giống biến, một List có thể chứa số lượng giá trị n; bạn sẽ thực hiện các phép toán số học trên hai danh sách thay vì hai biến.
Hãy cùng tìm hiểu nhanh cách thực hiện.
Để áp dụng các phép toán số học, bạn sẽ sử dụng hàm zipped.map theo sau là các danh sách x và y. Sau đó bạn sẽ chỉ định trong phương thức zipped.map phép toán muốn thực hiện như một đối số.


Cuối cùng, hãy viết một đoạn mã bao gồm tất cả các phương thức này.
object Scala_List_Methods
{
def main(args: Array[String])
{
// define two lists
val x = List(1, 40, 10)
val y = List(20, 25, 30)
val z = List("DataCamp", "Tutorials", "Are", "The", "Best")
//Head
println();
println("Head of list x, y, z = " + (x.head, y.head, z.head));
println();
//Tail
println("Tail of list x, y, z = " + (x.tail, y.tail, z.tail));
println();
//isEmpty
println("Is list x, y, z empty? = " + (x.isEmpty, y.isEmpty, z.isEmpty));
println();
//Concatenate
println("Concatenating x, y, z lists with the first method = " + (x:::y:::z));
println("Concatenating x, y, z lists with the second method = " + ((x).:::(y).:::(z)));
println("Concatenating x, y, z lists with the third method = " + (List.concat(x,y,z)));
println();
//Reverse
println("Reverse of x, y, z is = " + (x.reverse, y.reverse, z.reverse));
println();
//Fill
println("Output of Fill method is = " + (List.fill(5)(z)));
println();
//Tabulate
println("Output of Tabulate method is = " + (List.tabulate(5)(x => x * x * x)));
}
}

Kết luận
Chúc mừng bạn đã hoàn thành hướng dẫn Scala này.
Vui lòng đặt câu hỏi liên quan đến hướng dẫn này trong phần bình luận bên dưới.