Elixir-목록과 튜플
(연결된) 목록
연결 목록은 메모리의 다른 위치에 저장되고 참조를 사용하여 추적되는 이기종 요소 목록입니다. 연결된 목록은 특히 함수형 프로그래밍에 사용되는 데이터 구조입니다.
Elixir는 대괄호를 사용하여 값 목록을 지정합니다. 값은 모든 유형이 될 수 있습니다-
[1, 2, true, 3]
Elixir가 인쇄 가능한 ASCII 숫자 목록을 볼 때 Elixir는이를 문자 목록 (문자 그대로 문자 목록)으로 인쇄합니다. IEx에서 값을보고 그것이 무엇인지 확실하지 않을 때마다i 그것에 대한 정보를 검색하는 함수.
IO.puts([104, 101, 108, 108, 111])
목록에있는 위의 문자는 모두 인쇄 가능합니다. 위의 프로그램이 실행되면 다음과 같은 결과가 생성됩니다.
hello
작은 따옴표를 사용하여 다른 방법으로 목록을 정의 할 수도 있습니다.
IO.puts(is_list('Hello'))
위의 프로그램이 실행되면 다음과 같은 결과가 생성됩니다.
true
작은 따옴표와 큰 따옴표 표현은 다른 유형으로 표현되기 때문에 Elixir에서 동일하지 않습니다.
목록의 길이
목록의 길이를 찾기 위해 다음 프로그램에서와 같이 길이 함수를 사용합니다.
IO.puts(length([1, 2, :true, "str"]))
위의 프로그램은 다음 결과를 생성합니다-
4
연결과 빼기
두 목록은 다음을 사용하여 연결하고 뺄 수 있습니다. ++ 과 --연산자. 기능을 이해하려면 다음 예제를 고려하십시오.
IO.puts([1, 2, 3] ++ [4, 5, 6])
IO.puts([1, true, 2, false, 3, true] -- [true, false])
이것은 첫 번째 경우에 연결된 문자열을 제공하고 두 번째 경우에는 뺀 문자열을 제공합니다. 위의 프로그램은 다음 결과를 생성합니다-
[1, 2, 3, 4, 5, 6]
[1, 2, 3, true]
목록의 머리와 꼬리
머리는 목록의 첫 번째 요소이고 꼬리는 목록의 나머지 부분입니다. 함수로 검색 할 수 있습니다.hd 과 tl. 변수에 목록을 할당하고 머리와 꼬리를 검색해 보겠습니다.
list = [1, 2, 3]
IO.puts(hd(list))
IO.puts(tl(list))
이것은 우리에게 출력으로 목록의 머리와 꼬리를 줄 것입니다. 위의 프로그램은 다음 결과를 생성합니다-
1
[2, 3]
Note − 빈 목록의 머리 또는 꼬리를 가져 오는 것은 오류입니다.
기타 목록 기능
Elixir 표준 라이브러리는 목록을 처리 할 수있는 많은 기능을 제공합니다. 여기에서 몇 가지를 살펴 보겠습니다. 나머지는 여기 목록 에서 확인할 수 있습니다 .
S.no. | 기능 이름 및 설명 |
---|---|
1 |
delete(list, item) 목록에서 주어진 항목을 삭제합니다. 항목없이 목록을 반환합니다. 항목이 목록에서 두 번 이상 나타나는 경우 첫 번째 항목 만 제거됩니다. |
2 |
delete_at(list, index) 지정된 인덱스에서 값을 제거하여 새 목록을 생성합니다. 음수 인덱스는 목록 끝에서 오프셋을 나타냅니다. 인덱스가 범위를 벗어나면 원래 목록이 반환됩니다. |
삼 |
first(list) 목록의 첫 번째 요소를 반환하거나 목록이 비어 있으면 nil을 반환합니다. |
4 |
flatten(list) 주어진 중첩 목록 목록을 평면화합니다. |
5 |
insert_at(list, index, value) 지정된 인덱스에 값이 삽입 된 목록을 반환합니다. 인덱스는 목록 길이로 제한됩니다. 음수 인덱스는 목록 끝에서 오프셋을 나타냅니다. |
6 |
last(list) 목록의 마지막 요소를 반환하거나 목록이 비어 있으면 nil을 반환합니다. |
튜플
튜플은 또한 그 안에 많은 다른 구조를 저장하는 데이터 구조입니다. 목록과 달리 연속 된 메모리 블록에 요소를 저장합니다. 즉, 인덱스 당 튜플 요소에 액세스하거나 튜플 크기를 얻는 것이 빠른 작업입니다. 인덱스는 0부터 시작합니다.
Elixir는 중괄호를 사용하여 튜플을 정의합니다. 리스트와 마찬가지로 튜플은 모든 값을 보유 할 수 있습니다.
{:ok, "hello"}
튜플의 길이
튜플의 길이를 얻으려면 tuple_size 다음 프로그램에서와 같이 기능-
IO.puts(tuple_size({:ok, "hello"}))
위의 프로그램은 다음 결과를 생성합니다-
2
값 추가
튜플에 값을 추가하려면 Tuple.append 함수를 사용하십시오.
tuple = {:ok, "Hello"}
Tuple.append(tuple, :world)
그러면 새 튜플이 생성되고 반환됩니다. {: ok, "Hello", : world}
값 삽입
주어진 위치에 값을 삽입하려면 Tuple.insert_at 기능 또는 put_elem함수. 같은 것을 이해하기 위해 다음 예제를 고려하십시오-
tuple = {:bar, :baz}
new_tuple_1 = Tuple.insert_at(tuple, 0, :foo)
new_tuple_2 = put_elem(tuple, 1, :foobar)
그것을주의해라 put_elem 과 insert_at새로운 튜플을 반환했습니다. Elixir 데이터 유형은 변경 불가능하기 때문에 튜플 변수에 저장된 원래 튜플은 수정되지 않았습니다. 불변성으로 인해 Elixir 코드는 특정 코드가 데이터 구조를 제자리에서 변경하는지 걱정할 필요가 없기 때문에 추론하기가 더 쉽습니다.
튜플 대 목록
목록과 튜플의 차이점은 무엇입니까?
목록은 연결된 목록으로 메모리에 저장됩니다. 즉, 목록의 각 요소는 해당 값을 보유하고 목록 끝에 도달 할 때까지 다음 요소를 가리 킵니다. 우리는 각 쌍의 값과 포인터를 단점 셀이라고 부릅니다. 즉, 목록의 길이에 액세스하는 것은 선형 작업입니다. 목록의 크기를 파악하려면 전체 목록을 탐색해야합니다. 목록을 업데이트하는 것은 요소를 추가하는 한 빠릅니다.
반면에 튜플은 메모리에 연속적으로 저장됩니다. 이것은 튜플 크기를 얻거나 인덱스로 요소에 액세스하는 것이 빠르다는 것을 의미합니다. 그러나 튜플에 요소를 업데이트하거나 추가하려면 전체 튜플을 메모리에 복사해야하므로 비용이 많이 듭니다.