Elixir - Listas y tuplas

Listas (vinculadas)

Una lista enlazada es una lista heterogénea de elementos que se almacenan en diferentes ubicaciones en la memoria y de los que se hace un seguimiento mediante referencias. Las listas enlazadas son estructuras de datos especialmente utilizadas en programación funcional.

Elixir usa corchetes para especificar una lista de valores. Los valores pueden ser de cualquier tipo:

[1, 2, true, 3]

Cuando Elixir ve una lista de números ASCII imprimibles, Elixir lo imprimirá como una lista de caracteres (literalmente, una lista de caracteres). Siempre que vea un valor en IEx y no esté seguro de cuál es, puede usar eli función para recuperar información sobre él.

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

Los caracteres anteriores de la lista se pueden imprimir. Cuando se ejecuta el programa anterior, produce el siguiente resultado:

hello

También puede definir listas al revés, utilizando comillas simples:

IO.puts(is_list('Hello'))

Cuando se ejecuta el programa anterior, produce el siguiente resultado:

true

Tenga en cuenta que las representaciones entre comillas simples y dobles no son equivalentes en Elixir ya que están representadas por diferentes tipos.

Longitud de una lista

Para encontrar la longitud de una lista, usamos la función de longitud como en el siguiente programa:

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

El programa anterior genera el siguiente resultado:

4

Concatenación y resta

Se pueden concatenar y restar dos listas usando el ++ y --operadores. Considere el siguiente ejemplo para comprender las funciones.

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

Esto le dará una cadena concatenada en el primer caso y una cadena restada en el segundo. El programa anterior genera el siguiente resultado:

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

Cabeza y cola de una lista

La cabeza es el primer elemento de una lista y la cola es el resto de una lista. Se pueden recuperar con las funcioneshd y tl. Asignemos una lista a una variable y recuperemos su cabeza y cola.

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

Esto nos dará la cabeza y la cola de la lista como salida. El programa anterior genera el siguiente resultado:

1
[2, 3]

Note - Obtener la cabeza o la cola de una lista vacía es un error.

Otras funciones de lista

La biblioteca estándar de Elixir proporciona una gran cantidad de funciones para manejar listas. Echaremos un vistazo a algunos de ellos aquí. Puedes ver el resto aquí Lista .

S.no. Nombre y descripción de la función
1

delete(list, item)

Elimina el elemento dado de la lista. Devuelve una lista sin el artículo. Si el elemento aparece más de una vez en la lista, solo se elimina la primera aparición.

2

delete_at(list, index)

Produce una nueva lista eliminando el valor en el índice especificado. Los índices negativos indican un desplazamiento desde el final de la lista. Si el índice está fuera de los límites, se devuelve la lista original.

3

first(list)

Devuelve el primer elemento de la lista o nulo si la lista está vacía.

4

flatten(list)

Aplana la lista dada de listas anidadas.

5

insert_at(list, index, value)

Devuelve una lista con el valor insertado en el índice especificado. Tenga en cuenta que el índice está limitado a la longitud de la lista. Los índices negativos indican un desplazamiento desde el final de la lista.

6

last(list)

Devuelve el último elemento de la lista o nulo si la lista está vacía.

Tuplas

Las tuplas también son estructuras de datos que almacenan otras estructuras dentro de ellas. A diferencia de las listas, almacenan elementos en un bloque de memoria contiguo. Esto significa que acceder a un elemento de tupla por índice u obtener el tamaño de la tupla es una operación rápida. Los índices comienzan desde cero.

Elixir usa llaves para definir tuplas. Como las listas, las tuplas pueden contener cualquier valor:

{:ok, "hello"}

Duración de una tupla

Para obtener la longitud de una tupla, use la tuple_size funciona como en el siguiente programa -

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

El programa anterior genera el siguiente resultado:

2

Agregar un valor

Para agregar un valor a la tupla, use la función Tuple.append -

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

Esto creará y devolverá una nueva tupla: {: ok, "Hola",: mundo}

Insertar un valor

Para insertar un valor en una posición dada, podemos usar el Tuple.insert_at función o la put_elemfunción. Considere el siguiente ejemplo para entender lo mismo:

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

Darse cuenta de put_elem y insert_atdevolvió nuevas tuplas. La tupla original almacenada en la variable de tupla no se modificó porque los tipos de datos de Elixir son inmutables. Al ser inmutable, el código Elixir es más fácil de razonar, ya que nunca debe preocuparse si un código en particular está mutando su estructura de datos en su lugar.

Tuplas frente a listas

¿Cuál es la diferencia entre listas y tuplas?

Las listas se almacenan en la memoria como listas enlazadas, lo que significa que cada elemento de una lista mantiene su valor y apunta al siguiente elemento hasta que se llega al final de la lista. Llamamos a cada par de valor y puntero una celda de contras. Esto significa que acceder a la longitud de una lista es una operación lineal: necesitamos recorrer toda la lista para calcular su tamaño. Actualizar una lista es rápido siempre que agreguemos elementos.

Las tuplas, por otro lado, se almacenan contiguamente en la memoria. Esto significa que obtener el tamaño de la tupla o acceder a un elemento por índice es rápido. Sin embargo, actualizar o agregar elementos a las tuplas es costoso porque requiere copiar toda la tupla en la memoria.