Li

Listas em Elixir

47 exercícios

Sobre Listas

As listas são um tipo de dados básico em Elixir para guardar uma coleção de valores. As listas são imutáveis, ou seja, não podem ser modificadas. Qualquer operação que altere uma lista devolve uma nova lista. As listas implementam o protocolo Enumerable, o que permite usar as funções dos módulos Enum e Stream.

As listas em Elixir são implementadas como listas ligadas e não como arrays de localizações de memória contíguas. Por isso, aceder a um elemento de uma lista demora um tempo linear, que depende do comprimento da lista.

As listas podem ser escritas na forma literal, na notação cabeça-cauda (que usa o operador cons, |), ou numa combinação das duas:

# Literal Form
[]
[1]
[1, 2, 3]

# Head-tail Notation
[]
# same as [1]
[1 | []]
# same as [1, 2, 3]
[1 | [2 | [3 | []]]]

# Mixed
# same as [1, 2, 3]
[1 | [2, 3]]

Também pode haver mais do que um elemento antes do operador cons (|).

# Multiple prepends
[1, 2, 3 | [4, 5]]

A notação cabeça-cauda pode ser usada para acrescentar itens ao fim de uma lista.

list = [2, 1]

[3, 2, 1] == [3 | list]
# => true

Acrescentar elementos a uma lista durante uma iteração é considerado um antipadrão. Acrescentar um elemento exige percorrer a lista toda e adicionar o elemento no fim; por isso, acrescentar um novo elemento em cada iteração obrigaria a percorrer a lista toda em cada iteração.

Podemos obter o mesmo resultado acrescentando um elemento ao início da lista invertida e invertendo o resultado a seguir. Acrescentar ao início é uma operação rápida e demora um tempo constante.

# Appending to the end of a list (potentially slow)
[1, 2, 3] ++ [4] ++ [5] ++ [6]

# Prepend to the start of a list (faster, due to the nature of linked lists)
[6 | [5 | [4 | [3, 2, 1]]]]
# then reverse!

Existem várias funções comuns do Kernel para listas:

  • hd/1 devolve a cabeça de uma lista, ou seja, o primeiro item da lista.
  • tl/1 devolve a cauda da lista, isto é, a lista sem o primeiro item.
  • length/1 devolve o número de itens da lista.
  • in/2 devolve um valor booleano que indica se o item é um elemento da lista.

Existe também o módulo List.

As listas podem conter qualquer tipo de dados, bem como uma mistura de tipos de dados diferentes.

list = [1, :a, 2.0, "string"]
Editar via GitHub A ligação abre numa nova janela ou separador

Aprende Listas

A prática está bloqueada

Desbloqueia mais 6 exercícios para praticares Listas