Elixir - Danh sách từ khóa

Cho đến nay, chúng ta chưa thảo luận về bất kỳ cấu trúc dữ liệu liên kết nào, tức là cấu trúc dữ liệu có thể liên kết một giá trị nhất định (hoặc nhiều giá trị) với một khóa. Các ngôn ngữ khác nhau gọi các tính năng này bằng các tên khác nhau như từ điển, băm, mảng kết hợp, v.v.

Trong Elixir, chúng ta có hai cấu trúc dữ liệu kết hợp chính: danh sách từ khóa và bản đồ. Trong chương này, chúng tôi sẽ tập trung vào danh sách Từ khóa.

Trong nhiều ngôn ngữ lập trình chức năng, người ta thường sử dụng danh sách các bộ giá trị 2 mục làm đại diện cho cấu trúc dữ liệu kết hợp. Trong Elixir, khi chúng ta có một danh sách các bộ giá trị và mục đầu tiên của bộ mã (tức là khóa) là một nguyên tử, chúng ta gọi nó là danh sách từ khóa. Hãy xem xét ví dụ sau để hiểu tương tự -

list = [{:a, 1}, {:b, 2}]

Elixir hỗ trợ một cú pháp đặc biệt để xác định các danh sách như vậy. Chúng ta có thể đặt dấu hai chấm ở cuối mỗi nguyên tử và loại bỏ hoàn toàn các bộ giá trị. Ví dụ,

list_1 = [{:a, 1}, {:b, 2}]
list_2 = [a: 1, b: 2]
IO.puts(list_1 == list_2)

Chương trình trên sẽ tạo ra kết quả sau:

true

Cả hai đều đại diện cho một danh sách từ khóa. Vì danh sách từ khóa cũng là danh sách, chúng tôi có thể sử dụng tất cả các thao tác mà chúng tôi đã sử dụng trên danh sách trên chúng.

Để truy xuất giá trị được liên kết với một nguyên tử trong danh sách từ khóa, hãy chuyển nguyên tử thành [] sau tên của danh sách -

list = [a: 1, b: 2]
IO.puts(list[:a])

Chương trình trên tạo ra kết quả sau:

1

Danh sách từ khóa có ba đặc điểm đặc biệt -

  • Chìa khóa phải là nguyên tử.
  • Các phím được đặt hàng, theo chỉ định của nhà phát triển.
  • Chìa khóa có thể được trao nhiều lần.

Để thao tác danh sách từ khóa, Elixir cung cấp mô-đun Từ khóa . Tuy nhiên, hãy nhớ rằng danh sách từ khóa chỉ đơn giản là danh sách và do đó chúng cung cấp các đặc điểm hiệu suất tuyến tính giống như danh sách. Danh sách càng dài thì càng mất nhiều thời gian để tìm khóa, đếm số lượng mục, v.v. Vì lý do này, danh sách từ khóa được sử dụng chủ yếu trong Elixir dưới dạng tùy chọn. Nếu bạn cần lưu trữ nhiều mục hoặc đảm bảo các liên kết một khóa có giá trị tối đa, bạn nên sử dụng bản đồ để thay thế.

Truy cập một khóa

Để truy cập các giá trị được liên kết với một khóa nhất định, chúng tôi sử dụng Keyword.getchức năng. Nó trả về giá trị đầu tiên được liên kết với khóa đã cho. Để nhận tất cả các giá trị, chúng tôi sử dụng hàm Keyword.get_values. Ví dụ -

kl = [a: 1, a: 2, b: 3] 
IO.puts(Keyword.get(kl, :a)) 
IO.puts(Keyword.get_values(kl))

Chương trình trên sẽ tạo ra kết quả sau:

1
[1, 2]

Chèn khóa

Để thêm một giá trị mới, hãy sử dụng Keyword.put_new. Nếu khóa đã tồn tại, giá trị của nó vẫn không thay đổi -

kl = [a: 1, a: 2, b: 3]
kl_new = Keyword.put_new(kl, :c, 5)
IO.puts(Keyword.get(kl_new, :c))

Khi chương trình trên được chạy, nó tạo ra một danh sách Từ khoá mới với khoá bổ sung, c và tạo ra kết quả sau:

5

Xóa khóa

Nếu bạn muốn xóa tất cả các mục nhập cho một khóa, hãy sử dụng Keyword.delete; để chỉ xóa mục nhập đầu tiên cho một khóa, hãy sử dụng Keyword.delete_first.

kl = [a: 1, a: 2, b: 3, c: 0]
kl = Keyword.delete_first(kl, :b)
kl = Keyword.delete(kl, :a)

IO.puts(Keyword.get(kl, :a))
IO.puts(Keyword.get(kl, :b))
IO.puts(Keyword.get(kl, :c))

Điều này sẽ xóa đầu tiên b trong Danh sách và tất cả atrong danh sách. Khi chương trình trên được chạy, nó sẽ tạo ra kết quả sau:

0