Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Listas

21/37
Recursos

Aportes 11

Preguntas 9

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Tipos de listas
Las colecciones se pueden clasificar en dos grandes grupos, las mutables e inmutables. Es decir, las que se pueden editar (mutables) y las que son solo de lectura (inmutable).

Listas inmutables
La declaración de una lista inmutable sería así.

val readOnly: List<String> = listOf("Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo")

Existen varias funciones útiles para trabajar con ellas.

val readOnly: List<String> = listOf("Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo")
readOnly.size //Muestra el tamaño de la lista
readOnly.get(3) //Devuelve el valor de la posición 3
readOnly.first() //Devuelve el primer valor
readOnly.last() //Devuelve el último valor
println(readOnly) //[Lunes, Martes, Miércoles, Jueves, Viernes, Sábado, Domingo]

Como pueden ver podemos trabajar completamente con ellas, a excepción de añadir más elementos.

También podemos filtrar usando el patrón iterator, que es un mecanismo para acceder a los elementos de la lista, por ejemplo .first() o .last()

val a = readOnly.filter { it == "Lunes" || it == "Juernes" }

El .filter nos permite filtrar en la lista a través de una o varias condiciones que pongamos. Para ello llamamos a it (iterator) y buscaremos en la lista, si contiene la palabra «Lunes» o «Juernes«. En este caso solo pintará «Lunes«.

Listas mutables
Ahora nos toca hablar de las más interesantes, las listas mutables, que poseen todo lo anterior, pero también nos da la posibilidad de ir rellenando la lista a medida que lo necesitemos, el único inconveniente es que más ineficiente con la memoria.

var mutableList: MutableList<String> = mutableListOf("Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado")
    println(readOnly) //[Lunes, Martes, Miércoles, Jueves, Viernes, Sábado]
    mutableList.add("domingo")

La definición es muy similar, a través de la función mutableListOf. Ahora si os fijáis he añadido de lunes a sábado que será lo que pintará, luego, usando mutableList.add he añadido el domingo.

Por defecto los valores se irán añadiendo en la última posición, pero podemos añadir el índice en el que queramos escribir nuestro valor.

mutableList.add(0, "Semana: ")

Con esto, si pintásemos la lista nos mostraría lo siguiente.

[Semana: , Lunes, Martes, Miércoles, Jueves, Viernes, Sábado, domingo]

Ahora tenemos que tener cuidado con una lista mutable por el simple hecho de que podría estar vacía o contener un null. Un null es un valor nulo en una de sus posiciones, que, si acedemos a él e intentamos operar, la aplicación se romperá, nos saltará un crash. Para ello, tenemos algunas funciones que nos permitirá trabajar como una lista inmutable, pero con seguridad.

var mutableList: MutableList<String> = mutableListOf()
   mutableList.none() //Nos devuelve un true si está vacía la lista
   mutableList.firstOrNull() //Nos devolverá el primer campo, y si no hay, un null.
   mutableList.elementAtOrNull(2) //El elemento del índice 2, si no hay, devolverá un null
   mutableList.lastOrNull() //Último valor de la lista o null

En este ejemplo he instanciado una lista sin valor alguno, por lo que está vacía. Con todos esos métodos recuperaremos un null (menos el primero que dará true) y la aplicación seguirá corriendo, si por le contrario hubiera puesto un .first() nos hubiese pasado lo siguiente.

curso de programación kotlin

Debemos de tener mucho cuidado a la hora de trabajar con datos que puedan mutar.

Recorriendo listas

Esta sería la forma más sencilla, y nos devolvería el contenido de cada uno de los valores de la lista.


for (item in mutableList) {
      print(item)
  }

Si necesitamos saber también la posición de cada uno de los valores podemos usar la función .withIndex que nos permite generar 2 variables, la primera será la posición y la segunda el contenido.

for ((indice, item) in mutableList.withIndex()) {
      println("La posición $indice contiene $item")
  }

Para el último ejemplo, usaremos .forEach, una función que hará que por cada posición haga una cosa, por ejemplo pintar el valor como el for anterior. A diferencia de ellos, no tenemos una variable con el contenido (véase índice e item) sino que accedemos a él con el iterator, en este caso simplemente habría que poner it.

En este ejemplo imaginemos que queremos añadir a los días de la semana dos puntos «:» así que vamos a crear una nueva lista (mutable) e iremos rellenando la lista a través del forEach.

val mutableList: MutableList<String> = mutableListOf("Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado")
  val newListEmpty: MutableList<String> = mutableListOf()
  mutableList.forEach {
      newListEmpty.add(it+":")
  }
  print(newListEmpty)
 

Otra forma de imprimir un Array es usando la función joinToString la cual acepta varios parámetros que modifican el resultado por ejemplo:

separator: El carácter que va a separar los datos por defecto es la coma (,).

prefix: El carácter que va al inicio del array.

postfix: El carácter que va al final del array.

fun main() {
val numeros = arrayOf(1, 2, 3, 4)
print(numeros.joinToString("-", “+”, “+”)) //+1-2-3-4+
}




Excelente clase. Recuerden!

  • Las listas son inmutables, si queremos agregar, remover o usar funciones mas avanzadas necesitaremos una mutableList.
  • Podemos tener valores duplicados en una lista
  • Podemos recorrer todos los elementos de una lista
  • La principal diferencia entre una lista y un array es que la lista no puede actualizar ninguna de las referencias que almacena

Para el performance también podríamos utilizar secuencias. Antes de iniciar las operaciones con la lista la convertimos a secuencia, operamos en esa secuencia y finalmente la regresamos a lista al final de las operaciones.

¿A que se refiere con utilizar un código “súper perfomance”?

  • Si está utilizando ARRAYS los datos se almacenarán de forma secuencial en el almacenamiento, es decir, se asignará un bloque continuo de almacenamiento para almacenar los datos. Pero si hablamos de LISTAS, entonces es una interfaz que puede tener diferentes implementaciones como ArrayList <T>, LinkedList <T>, etc. y la representación en memoria de estos List <T> depende de la implementación, es decir, si es ArrayList <T> o LinkedList <T> o algo más.

  • Supongamos en el futuro, si queremos cambiar un elemento por otro no podremos porque las List son de naturaleza inmutable. Por lo tanto, no puede actualizar los valores List <T>. Para actualizar los valores, debe usar MutableList <T>. En cambio los Arrays si pueden actualizar sus valores.

  • ¿Qué pasa si en el futuro queremos agregar algunos elementos? En este caso, si estamos usando Arrays, entonces no podemos agregar ningún valor adicional a nuestra variable de cursos porque las matrices tienen un tamaño fijo y no podemos aumentar o disminuir el tamaño de una matriz.

  • Pero si usamos MutableList <T>, podemos agregar algunos valores usando el método add y eliminar algunos valores usando el método remove.

  • Entonces, estas son algunas de las diferencias entre una lista y una matriz. Si tiene datos de tamaño fijo, se pueden utilizar matrices. Si bien el tamaño de los datos puede variar, se pueden usar listas mutables.

Info:

MindOrks

 val listaDeNombres = listOf("Juan", "Enrique", "Camila")
    println(listaDeNombres)

    val listaVacia = mutableListOf<String>()
    println(listaVacia)
    listaVacia.add("Juan")
    println(listaVacia)

    val valorUsandoGet = listaVacia.get(0)
    println(valorUsandoGet)

    val valorUsandoOperador = listaVacia[0]
    println(valorUsandoOperador)

    val primerValor: String? = listaDeNombres.firstOrNull()
    println(primerValor)

    listaVacia.removeAt(0)
    println(listaVacia)

    listaVacia.add("Enrique")
    println(listaVacia)
    listaVacia.removeIf { caracteres -> caracteres.length > 3 }
    println(listaVacia)

    val myArray = arrayOf(1,2,3,4)
    println("Nuestro array $myArray")
    println("Array como lista ${myArray.toList()}")
<fun main(args: Array<String>) {
    val listaDeNombres = listOf("Juan", "Enrique", "Camila")
    println(listaDeNombres)

    val listaVacia = mutableListOf<String>()
    println(listaVacia)
    listaVacia.add("Juan")
    println(listaVacia)

    val valorUsandoGet = listaVacia.get(0)
    println(valorUsandoGet)

    val valorUsandoOperador = listaVacia[0]
    println(valorUsandoOperador)

    val primerValor: String? = listaDeNombres.firstOrNull()
    println(primerValor)

    listaVacia.removeAt(0)
    println(listaVacia)

    listaVacia.add("Enrique")
    println(listaVacia)
    listaVacia.removeIf { caracteres -> caracteres.length > 3 }
    println(listaVacia)

    val myArray = arrayOf(1,2,3,4)
    println("Nuestro array $myArray")
    println("Array como lista ${myArray.toList()}")
}> 

ARRAYS
Las arrays (o arreglos) son secuencias de datos, del mismo tipo e identificados por un nombre común. Para hacerlo más fácil de entender imaginemos que tenemos que almacenar los 7 días de la semana, podríamos crear 7 variables Strings o almacenarlas todas en una sola array.

fun main(args: Array<String>) {
    val weekDays = arrayOf("Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo")
}

Ahora la variable weekDays contiene todos los días de la semana. Ahora para acceder a cada uno de los valores, lo haremos a través de la posición. Por ejemplo, imaginemos un edificio, cada valor se almacena en una planta, por lo que el primer valor estará en la posición 0, el segundo en la 1 y así con cada uno de ellos. Recordar que se empieza en la posición 0.

Entonces podremos acceder a cada uno de los valores gracias a la función get() que nos devolverá el valor de dicha posición.

fun main(args: Array<String>) {
 val weekDays = arrayOf("Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo") 
    println(weekDays.get(0))
    println(weekDays.get(1))
    println(weekDays.get(2))
    println(weekDays.get(3))
    println(weekDays.get(4))
    println(weekDays.get(5))
    println(weekDays.get(6))
}

Esto nos pintará los días de la semana (posiciones de la 0 a la 6). Si pusiéramos en el get una posición que no tiene, por ejemplo la 7 nos daría una excepción al ejecutarse la aplicación ArrayIndexOutOfBoundsException, y es por ello por lo que al trabajar con arrays debemos tener bien claro el tamaño de la array.

Para evitar ese tipo de problemas podemos usar la función size, que nos devolverá el tamaño de dicha array.

fun main(args: Array<String>) {
    val weekDays = arrayOf("Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo")
    println(weekDays.get(0))
    println(weekDays.get(1))
    println(weekDays.get(2))
    println(weekDays.get(3))
    println(weekDays.get(4))
    println(weekDays.get(5))
    println(weekDays.get(6))
    if(weekDays.size >= 8){
        println(weekDays.get(7))
    }else{
        println("no tiene más parámetros la array")
    }
}

Si ejecutamos dicho código no entrará en el if porque el tamaño de la array es de 7 (No es lo mismo tamaño que posición), por lo que nos pintará «no tiene más parámetros en la array».

Como había dicho al principio del post, las array tienen una serie de limitaciones, entre ellas que tienen que tener un tamaño fijo y será el número de valores que le asignemos al instanciarla, eso significa que siempre va a tener un tamaño de 7, y no podremos añadir más datos, pero si cambiarlos a través de la función set().

weekDays.set(0, "Horrible lunes") //Contenía Lunes
weekDays.set(4, "Por fin viernes") //Contenía Viernes

La función set() recibe dos parámetros, el primero es la posición a la que queremos acceder y el segundo el es nuevo valor a reemplazar. Hay que tener en cuenta que el valor que le mandemos debe ser del mismo tipo, por ejemplo esta array son de Strings, por lo que no podemos pasar un Int.

Recorriendo Arrays

Ahora que ya conocemos un poco más que es una array y como trabajar con ellas, vamos a ver como recorrerlas.

Aunque podríamos hacerlo como hicimos arriba, hay modos más rápidos y óptimos, el bucle for(). Este bucle nos permite entre otras, recorrer la array entera, posición por posición y acceder a cada uno de los parámetros que contiene. Vamos a volver a pintar los 7 días de la semana con este método.

fun main(args: Array<String>) {
    val weekDays = arrayOf("Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo")
    for (posicion in weekDays.indices){
        println(weekDays.get(posicion))
    }
}

Mucho menos código ¿verdad?. Vamos a ver que es lo que hemos hecho.

El for necesitará una variable, en este caso «posición» que irá teniendo el valor de cada una de las posiciones de la array. Su funcionamiento es muy sencillo, cuando pasa por el for por primera vez, tendrá valor 0, entonces comprueba el tamaño de weekDays y si es mayor, entra a la función, hace lo que le pidamos (en este caso pintar en la posición de la variable) y vuelve al inicio, así hasta llegar a 6 que será la última posición de la array.

También el for nos permite sacar tanto el índice como el valor directamente, para ello haríamos lo siguiente.

fun main(args: Array<String>) {
    val weekDays = arrayOf("Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo")
    for ((posicion, valor) in weekDays.withIndex()) {
        println("La posición $posicion contiene el valor $valor")
    }
}
Y dich

Si por el contrario solo os interesa el contenido podríamos hacer directamente un for in sin acceder a la posición, solo al contenido.


for (weekDay in weekDays) {
      println(weekDay)
  }

Devolviéndonos la lista de días de la semana.

fuente: https://cursokotlin.com/capitulo-9-arrays-kotlin/

   //Listas

    //Lista no mutable
    val listaDeNombres: List<String> = listOf<String>("Juan", "Ana", "Camilo")
    val listaDeDias = listOf("Lunes", "Martes", "Miercoles")
    println(listaDeNombres)
    println(listaDeDias)

    //Lista mutable
    //Crear la lista vacía
    val listaVacia = mutableListOf<String>()
    println(listaVacia)

    //Agregar elemento a la lista
    listaVacia.add(0, "Miguel")
    listaVacia.add(1, "Ángel")
    println(listaVacia)

    //Obtener  valores de la lista
    val valorUsandoGet = listaVacia.get(0)
    println(valorUsandoGet)

    val valorUsandoOperador = listaVacia[0]
    println(valorUsandoOperador)

    //Obtener el primer valor de la lista
    val primerValor: String? = listaDeNombres.firstOrNull()
    println(primerValor)

    //Eliminar elementos de la lista
    listaVacia.removeAt(0)
    println(listaVacia)

    //Eliminar elementos dependiendo de la condición
    listaVacia.removeIf { caracteres -> caracteres.length > 3 }
    println(listaVacia)

    //Arrays

    //Crear el array
    val myArray = arrayOf(1, 2, 3, 4)
    println("Nuestro array $myArray")
    //Convertir el array a lista para imprimir su contenido
    println("Array como lista ${myArray.toList()}")