Elixir - Danh sách và Tuples

(Liên kết) Danh sách

Danh sách liên kết là một danh sách không đồng nhất của các phần tử được lưu trữ tại các vị trí khác nhau trong bộ nhớ và được theo dõi bằng cách sử dụng các tham chiếu. Danh sách liên kết là cấu trúc dữ liệu đặc biệt được sử dụng trong lập trình chức năng.

Elixir sử dụng dấu ngoặc vuông để chỉ định danh sách các giá trị. Giá trị có thể thuộc bất kỳ loại nào -

[1, 2, true, 3]

Khi Elixir nhìn thấy danh sách các số ASCII có thể in được, Elixir sẽ in đó dưới dạng danh sách char (nghĩa đen là danh sách các ký tự). Bất cứ khi nào bạn thấy một giá trị trong IEx và bạn không chắc nó là gì, bạn có thể sử dụngi chức năng lấy thông tin về nó.

IO.puts([104, 101, 108, 108, 111])

Các ký tự trên trong danh sách đều có thể in được. Khi chương trình trên được chạy, nó tạo ra kết quả sau:

hello

Bạn cũng có thể xác định danh sách theo cách khác, bằng cách sử dụng dấu ngoặc kép -

IO.puts(is_list('Hello'))

Khi chương trình trên được chạy, nó tạo ra kết quả sau:

true

Hãy nhớ rằng các đại diện được trích dẫn đơn và được trích dẫn kép không tương đương nhau trong Elixir vì chúng được thể hiện bằng các kiểu khác nhau.

Độ dài của một danh sách

Để tìm độ dài của một danh sách, chúng ta sử dụng hàm độ dài như trong chương trình sau:

IO.puts(length([1, 2, :true, "str"]))

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

4

Phép cộng và phép trừ

Hai danh sách có thể được nối và trừ bằng cách sử dụng ++--các toán tử. Hãy xem xét ví dụ sau để hiểu các chức năng.

IO.puts([1, 2, 3] ++ [4, 5, 6])
IO.puts([1, true, 2, false, 3, true] -- [true, false])

Điều này sẽ cung cấp cho bạn một chuỗi được nối trong trường hợp đầu tiên và một chuỗi bị trừ trong trường hợp thứ hai. Chương trình trên tạo ra kết quả sau:

[1, 2, 3, 4, 5, 6]
[1, 2, 3, true]

Đầu và đuôi của một danh sách

Phần đầu là phần tử đầu tiên của danh sách và phần đuôi là phần còn lại của danh sách. Chúng có thể được truy xuất với các chức nănghdtl. Chúng ta hãy gán một danh sách cho một biến và truy xuất phần đầu và phần đuôi của nó.

list = [1, 2, 3]
IO.puts(hd(list))
IO.puts(tl(list))

Điều này sẽ cho chúng ta phần đầu và phần đuôi của danh sách dưới dạng đầu ra. Chương trình trên tạo ra kết quả sau:

1
[2, 3]

Note - Bắt đầu hoặc đuôi của một danh sách trống là một lỗi.

Các chức năng Danh sách khác

Thư viện tiêu chuẩn Elixir cung cấp rất nhiều chức năng để xử lý danh sách. Chúng tôi sẽ xem xét một số trong số đó ở đây. Bạn có thể kiểm tra phần còn lại ở đây Danh sách .

S.no. Tên và mô tả chức năng
1

delete(list, item)

Xóa mục đã cho khỏi danh sách. Trả về một danh sách không có mục. Nếu mục xuất hiện nhiều lần trong danh sách, chỉ mục xuất hiện đầu tiên sẽ bị xóa.

2

delete_at(list, index)

Tạo một danh sách mới bằng cách xóa giá trị tại chỉ mục được chỉ định. Các chỉ số âm cho biết một khoảng chênh lệch từ cuối danh sách. Nếu chỉ mục nằm ngoài giới hạn, danh sách ban đầu sẽ được trả về.

3

first(list)

Trả về phần tử đầu tiên trong danh sách hoặc nil nếu danh sách trống.

4

flatten(list)

Làm phẳng danh sách đã cho của danh sách lồng nhau.

5

insert_at(list, index, value)

Trả về danh sách với giá trị được chèn tại chỉ mục đã chỉ định. Lưu ý rằng chỉ mục được giới hạn ở độ dài danh sách. Các chỉ số âm cho biết một khoảng chênh lệch so với phần cuối của danh sách.

6

last(list)

Trả về phần tử cuối cùng trong danh sách hoặc nil nếu danh sách trống.

Tuples

Tuples cũng là cấu trúc dữ liệu lưu trữ một số cấu trúc khác bên trong chúng. Không giống như danh sách, chúng lưu trữ các phần tử trong một khối bộ nhớ liền kề. Điều này có nghĩa là truy cập một phần tử tuple trên mỗi chỉ mục hoặc lấy kích thước tuple là một thao tác nhanh. Chỉ mục bắt đầu từ số không.

Elixir sử dụng dấu ngoặc nhọn để xác định các bộ giá trị. Giống như danh sách, các bộ giá trị có thể chứa bất kỳ giá trị nào -

{:ok, "hello"}

Chiều dài của một Tuple

Để có được chiều dài của một tuple, hãy sử dụng tuple_size hoạt động như trong chương trình sau:

IO.puts(tuple_size({:ok, "hello"}))

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

2

Bổ sung một giá trị

Để thêm giá trị vào tuple, hãy sử dụng hàm Tuple.append -

tuple = {:ok, "Hello"}
Tuple.append(tuple, :world)

Thao tác này sẽ tạo và trả về một tuple mới: {: ok, "Hello",: world}

Chèn giá trị

Để chèn một giá trị tại một vị trí nhất định, chúng ta có thể sử dụng Tuple.insert_at chức năng hoặc put_elemchức năng. Hãy xem xét ví dụ sau để hiểu tương tự -

tuple = {:bar, :baz}
new_tuple_1 = Tuple.insert_at(tuple, 0, :foo)
new_tuple_2 = put_elem(tuple, 1, :foobar)

Thông báo rằng put_eleminsert_atđã trả lại các bộ giá trị mới. Tuple ban đầu được lưu trữ trong biến tuple không được sửa đổi vì kiểu dữ liệu Elixir là bất biến. Bằng cách không thay đổi, mã Elixir dễ dàng lý giải hơn vì bạn không bao giờ cần phải lo lắng nếu một mã cụ thể đang thay đổi cấu trúc dữ liệu của bạn.

Tuples vs. Lists

Sự khác biệt giữa danh sách và bộ giá trị là gì?

Danh sách được lưu trữ trong bộ nhớ dưới dạng danh sách được liên kết, nghĩa là mỗi phần tử trong danh sách giữ giá trị của nó và trỏ đến phần tử sau cho đến khi đạt đến cuối danh sách. Chúng tôi gọi mỗi cặp giá trị và con trỏ là một ô khuyết điểm. Điều này có nghĩa là truy cập độ dài của một danh sách là một phép toán tuyến tính: chúng ta cần xem qua toàn bộ danh sách để tìm ra kích thước của nó. Việc cập nhật danh sách diễn ra nhanh chóng, miễn là chúng tôi đã bổ sung trước các yếu tố.

Mặt khác, các bộ dữ liệu được lưu trữ liên tục trong bộ nhớ. Điều này có nghĩa là nhanh chóng nhận được kích thước tuple hoặc truy cập một phần tử theo chỉ mục. Tuy nhiên, việc cập nhật hoặc thêm các phần tử vào bộ giá trị rất tốn kém vì nó yêu cầu sao chép toàn bộ bộ mã trong bộ nhớ.