Lista y ArrayList
Comencemos nuestra introducción a una estructura de datos llamada Lista
. Arriba tenemos un diagrama de flujo que nos muestra la Jerarquía de Colecciones y Listas. Podemos ver que es un diagrama bastante grande y complejo, pero vamos a desglosarlo paso a paso. En esta sección, nos familiarizaremos con un tipo de colección llamada listas. Exploraremos tipos de listas como ArrayList
, LinkedList
y Stack
.
Nota
No hablaremos de
Vector
, ya que es una estructura de datos obsoleta que ArrayList ha reemplazado por completo.
Como todas las Listas heredan de la interfaz List
, obviamente podemos crear objetos a través de la interfaz padre. Pero hablaremos de ello más adelante. Hablemos del primer tipo de lista - ArrayList
.
Arriba, ves la sintaxis para crear un ArrayList<>
. Hay una cosa desconocida para ti en esta sintaxis - es el generic. Hablaremos de los genéricos y de cómo crearlos más adelante. Por ahora, recuerda que estamos creando un ArrayList
y especificando el tipo de datos que se almacenará en esta lista dentro de los corchetes diamantes. Recuerda que las listas no pueden trabajar con tipos de datos primitivos. Para ello, utilizamos clases envoltorio.
Creemos una lista en el código e intentemos añadir algunos objetos a la lista usando el método add()
.
main.java
1234567891011121314package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> numberList = new ArrayList<>(); numberList.add(10); numberList.add(15); numberList.add(5); System.out.println(numberList); } }
Como puede ver, el método add()
es extremadamente sencillo. Simplemente añade a la lista el valor especificado en los parámetros. Además, ten en cuenta que debemos importar List
y ArrayList
de la librería java.util
. Sin embargo, IntelliJ IDEA importa automáticamente estas librerías por ti, así que no te preocupes.
Veamos un ejemplo de creación de una lista con nuestro tipo de datos personalizado:
main.java
1234567891011121314151617181920212223242526272829303132333435package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { Dog bob = new Dog("Bob", 2); Dog ben = new Dog("Ben", 1); Dog brian = new Dog("Brian", 5); List<Dog> dogList = new ArrayList<>(); dogList.add(bob); dogList.add(ben); dogList.add(brian); System.out.println(dogList); } } class Dog { String name; int age; public Dog(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Dog{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
Como puedes ver, creamos nuestra propia clase Dog
y creamos un ArrayList
con este tipo de datos. Cuando se imprime, obtenemos una lista completa de todos los objetos de la lista.
¿Qué hacemos si tenemos un array y queremos convertirlo en una lista? Podemos hacerlo utilizando el método de la clase Arrays - asList()
. Con este método, podemos crear una lista que contendrá los mismos elementos que el array original. Esto suele ser útil cuando necesitamos utilizar métodos de lista en un array. La sintaxis es bastante simple:
Arrays.asList(nombreArray);
Y podemos utilizarla inmediatamente al inicializar una nueva lista, por ejemplo:
main.java
12345678910111213141516171819202122232425262728293031323334package com.example; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { Dog bob = new Dog("Bob", 2); Dog ben = new Dog("Ben", 1); Dog brian = new Dog("Brian", 5); Dog[] dogs = {bob, ben, brian}; List<Dog> dogList = new ArrayList<>(Arrays.asList(dogs)); System.out.println(dogList); } } class Dog { String name; int age; public Dog(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Dog{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
Al igual que podemos convertir un array en una lista, podemos convertir una lista en un array utilizando el método toArray()
.
Métodos ArrayList<>
Vamos a repasar los métodos básicos para trabajar con una lista. Hasta este punto, podríamos sustituir fácilmente las listas por arrays, pero veamos la principal diferencia: los métodos.
El método add()
es un método sobrecargado y tiene un segundo uso:
Podemos añadir un elemento en un índice específico.
Nota
Las listas, como los arrays, tienen indexación basada en cero.
Cuando añadimos un elemento en el centro de la lista, todos los elementos a la derecha se desplazan una posición para hacer sitio al nuevo elemento. Por ejemplo, al añadir un elemento al principio de la lista, todos los elementos se desplazan una posición a la derecha. Veamos un ejemplo:
main.java
123456789101112131415161718package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> numbers = new ArrayList<>(); for (int i = 0; i < 5; i++) { // filling `numbers` list with 5 values numbers.add(i); } System.out.println("`numbers` before modifying: " + numbers); numbers.add(2, 10); // adding 10 on the second index System.out.println("`numbers` after first modifying: " + numbers); numbers.add(0, 5); System.out.println("`numbers` after second modifying: " + numbers); } }
En la ilustración se puede ver cómo cambian los valores:
Obviamente, si podemos añadir objetos a la lista por su índice, también podemos recuperar objetos de la lista por su índice utilizando el método get(int index)
. Veamos un ejemplo:
main.java
123456789101112131415package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> numbers = new ArrayList<>(); for (int i = 0; i < 5; i++) { // filling `numbers` list with 5 values numbers.add(i); } int element = numbers.get(1); System.out.println(element); } }
Podemos añadir, podemos recuperar, pero ¿podemos eliminar?
Claro que sí. Usando el método remove(int index)
.
Este método también está sobrecargado, así que hay otra forma de eliminar un elemento de la lista. Podemos utilizar el método remove(Object obj)
y eliminar la primera aparición del elemento especificado.
Imaginemos que tenemos una gran lista con todos los alumnos de nuestro curso. Pero uno de ellos se ha portado mal y ha sido expulsado. No sabemos en qué índice estaba registrado, así que debemos eliminarlo de la lista de alumnos. Pero hay un problema: el código está un poco roto, y su nombre puede haber aparecido en la lista varias veces. Escribamos un programa que elimine todas las menciones de este alumno de la lista:
main.java
123456789101112131415161718package com.example; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { String[] names = {"Bob", "Alice", "Charlie", "David", "Eva", "Frank", "Grace", "Hank", "Ivy", "Jack", "Katherine", "Leo", "Mia", "Nathan", "Olivia", "Paul", "Quinn", "Rachel", "Sam", "Tom", "Ursula", "Victor", "Wendy", "Xander", "Yvonne", "Zack", "Bob", "Emily", "Bob", "Jake", "Isabel", "Liam", "Nora", "Bob", "Sophia", "Bob", "Daniel", "Gabrielle", "Mike"}; // expelled student: Bob List<String> students = new ArrayList<>(Arrays.asList(names)); System.out.println("Is Bob present in the list? " + students.contains("Bob")); while (students.contains("Bob")) { students.remove("Bob"); } System.out.println("Is Bob still present in the list after the removal operation? " + students.contains("Bob")); } }
Te habrás dado cuenta de que hemos utilizado otro método de lista - contains(Object obj)
, que comprueba si el elemento especificado está presente en la lista y devuelve true
o false
. Usando este método, establecimos la condición para la ejecución del bucle while
, eliminando así todas las menciones de un alumno como "Bob" de la lista. **Maravilloso.
Por cierto, podríamos simplificar significativamente la resolución de este problema utilizando el método removeAll(Collection<?> c)
:
main.java
123456789101112131415161718package com.example; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { String[] names = {"Bob", "Alice", "Charlie", "David", "Eva", "Frank", "Grace", "Hank", "Ivy", "Jack", "Katherine", "Leo", "Mia", "Nathan", "Olivia", "Paul", "Quinn", "Rachel", "Sam", "Tom", "Ursula", "Victor", "Wendy", "Xander", "Yvonne", "Zack", "Bob", "Emily", "Bob", "Jake", "Isabel", "Liam", "Nora", "Bob", "Sophia", "Bob", "Daniel", "Gabrielle", "Mike"}; // expelled student: Bob List<String> students = new ArrayList<>(Arrays.asList(names)); System.out.println("Is Bob present in the list? " + students.contains("Bob")); List<String> expelledStudents = new ArrayList<>(); expelledStudents.add("Bob"); students.removeAll(expelledStudents); System.out.println("Is Bob still present in the list after the removal operation? " + students.contains("Bob")); } }
El método removeAll()
toma como parámetro una colección que contiene valores que eliminará de la colección sobre la que se ha llamado a este método.
De esta forma, creamos una colección de alumnos expulsados y añadimos "Bob" a ella. Esto nos permite ampliar fácilmente nuestro código simplemente añadiendo nuevos alborotadores a la colección de alumnos expulsados a lo largo del tiempo.
Volvamos a los métodos de lista; ahora tenemos el método actualizar en línea. Teniendo en cuenta que el método add()
simplemente desplaza todos los valores a la derecha después de sí mismo, tenemos que averiguar cómo actualizar un valor por índice. El método set(int index, Object value)
realiza esta acción:
main.java
12345678910111213141516package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> example = new ArrayList<>(); for (int i = 1; i <= 5; i++) { example.add(i); } System.out.println("List before modification: " + example); example.set(2, 28); System.out.println("List after modification: " + example); } }
Aquí es sencillo; sustituimos el elemento en el segundo índice por el número 28.
Otros métodos
Podríamos hablar de varios métodos para trabajar con esta lista durante mucho tiempo, pero nos llevaría mucho tiempo. Por lo tanto, puedes encontrar todos los métodos que necesites con documentación completa y explicaciones de su funcionamiento abriendo la clase ArrayList
en IntelliJ IDEA. Para ello, simplemente importa la librería ArrayList
, mantén pulsada la tecla comando (ctrl para Windows), y haz clic en ArrayList
. Aquí verás todos los campos y métodos de esta clase, lo que te permitirá familiarizarte con los métodos que podrías haberte perdido.
1. ¿Qué método podemos utilizar para añadir un elemento por índice?
2. ¿Qué método podemos utilizar para recuperar un elemento por índice?
3. ¿Qué método podemos utilizar para eliminar la primera aparición de un elemento?
4. ¿Qué método podemos utilizar para sustituir un elemento por el índice?
5. ¿Qué método podemos utilizar para comprobar la presencia de un elemento?
6. ¿Se puede crear una lista a partir de una matriz?
7. ¿Cómo podemos crear una lista a partir de una matriz?
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
Awesome!
Completion rate improved to 4
Lista y ArrayList
Desliza para mostrar el menú
Comencemos nuestra introducción a una estructura de datos llamada Lista
. Arriba tenemos un diagrama de flujo que nos muestra la Jerarquía de Colecciones y Listas. Podemos ver que es un diagrama bastante grande y complejo, pero vamos a desglosarlo paso a paso. En esta sección, nos familiarizaremos con un tipo de colección llamada listas. Exploraremos tipos de listas como ArrayList
, LinkedList
y Stack
.
Nota
No hablaremos de
Vector
, ya que es una estructura de datos obsoleta que ArrayList ha reemplazado por completo.
Como todas las Listas heredan de la interfaz List
, obviamente podemos crear objetos a través de la interfaz padre. Pero hablaremos de ello más adelante. Hablemos del primer tipo de lista - ArrayList
.
Arriba, ves la sintaxis para crear un ArrayList<>
. Hay una cosa desconocida para ti en esta sintaxis - es el generic. Hablaremos de los genéricos y de cómo crearlos más adelante. Por ahora, recuerda que estamos creando un ArrayList
y especificando el tipo de datos que se almacenará en esta lista dentro de los corchetes diamantes. Recuerda que las listas no pueden trabajar con tipos de datos primitivos. Para ello, utilizamos clases envoltorio.
Creemos una lista en el código e intentemos añadir algunos objetos a la lista usando el método add()
.
main.java
1234567891011121314package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> numberList = new ArrayList<>(); numberList.add(10); numberList.add(15); numberList.add(5); System.out.println(numberList); } }
Como puede ver, el método add()
es extremadamente sencillo. Simplemente añade a la lista el valor especificado en los parámetros. Además, ten en cuenta que debemos importar List
y ArrayList
de la librería java.util
. Sin embargo, IntelliJ IDEA importa automáticamente estas librerías por ti, así que no te preocupes.
Veamos un ejemplo de creación de una lista con nuestro tipo de datos personalizado:
main.java
1234567891011121314151617181920212223242526272829303132333435package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { Dog bob = new Dog("Bob", 2); Dog ben = new Dog("Ben", 1); Dog brian = new Dog("Brian", 5); List<Dog> dogList = new ArrayList<>(); dogList.add(bob); dogList.add(ben); dogList.add(brian); System.out.println(dogList); } } class Dog { String name; int age; public Dog(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Dog{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
Como puedes ver, creamos nuestra propia clase Dog
y creamos un ArrayList
con este tipo de datos. Cuando se imprime, obtenemos una lista completa de todos los objetos de la lista.
¿Qué hacemos si tenemos un array y queremos convertirlo en una lista? Podemos hacerlo utilizando el método de la clase Arrays - asList()
. Con este método, podemos crear una lista que contendrá los mismos elementos que el array original. Esto suele ser útil cuando necesitamos utilizar métodos de lista en un array. La sintaxis es bastante simple:
Arrays.asList(nombreArray);
Y podemos utilizarla inmediatamente al inicializar una nueva lista, por ejemplo:
main.java
12345678910111213141516171819202122232425262728293031323334package com.example; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { Dog bob = new Dog("Bob", 2); Dog ben = new Dog("Ben", 1); Dog brian = new Dog("Brian", 5); Dog[] dogs = {bob, ben, brian}; List<Dog> dogList = new ArrayList<>(Arrays.asList(dogs)); System.out.println(dogList); } } class Dog { String name; int age; public Dog(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Dog{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
Al igual que podemos convertir un array en una lista, podemos convertir una lista en un array utilizando el método toArray()
.
Métodos ArrayList<>
Vamos a repasar los métodos básicos para trabajar con una lista. Hasta este punto, podríamos sustituir fácilmente las listas por arrays, pero veamos la principal diferencia: los métodos.
El método add()
es un método sobrecargado y tiene un segundo uso:
Podemos añadir un elemento en un índice específico.
Nota
Las listas, como los arrays, tienen indexación basada en cero.
Cuando añadimos un elemento en el centro de la lista, todos los elementos a la derecha se desplazan una posición para hacer sitio al nuevo elemento. Por ejemplo, al añadir un elemento al principio de la lista, todos los elementos se desplazan una posición a la derecha. Veamos un ejemplo:
main.java
123456789101112131415161718package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> numbers = new ArrayList<>(); for (int i = 0; i < 5; i++) { // filling `numbers` list with 5 values numbers.add(i); } System.out.println("`numbers` before modifying: " + numbers); numbers.add(2, 10); // adding 10 on the second index System.out.println("`numbers` after first modifying: " + numbers); numbers.add(0, 5); System.out.println("`numbers` after second modifying: " + numbers); } }
En la ilustración se puede ver cómo cambian los valores:
Obviamente, si podemos añadir objetos a la lista por su índice, también podemos recuperar objetos de la lista por su índice utilizando el método get(int index)
. Veamos un ejemplo:
main.java
123456789101112131415package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> numbers = new ArrayList<>(); for (int i = 0; i < 5; i++) { // filling `numbers` list with 5 values numbers.add(i); } int element = numbers.get(1); System.out.println(element); } }
Podemos añadir, podemos recuperar, pero ¿podemos eliminar?
Claro que sí. Usando el método remove(int index)
.
Este método también está sobrecargado, así que hay otra forma de eliminar un elemento de la lista. Podemos utilizar el método remove(Object obj)
y eliminar la primera aparición del elemento especificado.
Imaginemos que tenemos una gran lista con todos los alumnos de nuestro curso. Pero uno de ellos se ha portado mal y ha sido expulsado. No sabemos en qué índice estaba registrado, así que debemos eliminarlo de la lista de alumnos. Pero hay un problema: el código está un poco roto, y su nombre puede haber aparecido en la lista varias veces. Escribamos un programa que elimine todas las menciones de este alumno de la lista:
main.java
123456789101112131415161718package com.example; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { String[] names = {"Bob", "Alice", "Charlie", "David", "Eva", "Frank", "Grace", "Hank", "Ivy", "Jack", "Katherine", "Leo", "Mia", "Nathan", "Olivia", "Paul", "Quinn", "Rachel", "Sam", "Tom", "Ursula", "Victor", "Wendy", "Xander", "Yvonne", "Zack", "Bob", "Emily", "Bob", "Jake", "Isabel", "Liam", "Nora", "Bob", "Sophia", "Bob", "Daniel", "Gabrielle", "Mike"}; // expelled student: Bob List<String> students = new ArrayList<>(Arrays.asList(names)); System.out.println("Is Bob present in the list? " + students.contains("Bob")); while (students.contains("Bob")) { students.remove("Bob"); } System.out.println("Is Bob still present in the list after the removal operation? " + students.contains("Bob")); } }
Te habrás dado cuenta de que hemos utilizado otro método de lista - contains(Object obj)
, que comprueba si el elemento especificado está presente en la lista y devuelve true
o false
. Usando este método, establecimos la condición para la ejecución del bucle while
, eliminando así todas las menciones de un alumno como "Bob" de la lista. **Maravilloso.
Por cierto, podríamos simplificar significativamente la resolución de este problema utilizando el método removeAll(Collection<?> c)
:
main.java
123456789101112131415161718package com.example; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { String[] names = {"Bob", "Alice", "Charlie", "David", "Eva", "Frank", "Grace", "Hank", "Ivy", "Jack", "Katherine", "Leo", "Mia", "Nathan", "Olivia", "Paul", "Quinn", "Rachel", "Sam", "Tom", "Ursula", "Victor", "Wendy", "Xander", "Yvonne", "Zack", "Bob", "Emily", "Bob", "Jake", "Isabel", "Liam", "Nora", "Bob", "Sophia", "Bob", "Daniel", "Gabrielle", "Mike"}; // expelled student: Bob List<String> students = new ArrayList<>(Arrays.asList(names)); System.out.println("Is Bob present in the list? " + students.contains("Bob")); List<String> expelledStudents = new ArrayList<>(); expelledStudents.add("Bob"); students.removeAll(expelledStudents); System.out.println("Is Bob still present in the list after the removal operation? " + students.contains("Bob")); } }
El método removeAll()
toma como parámetro una colección que contiene valores que eliminará de la colección sobre la que se ha llamado a este método.
De esta forma, creamos una colección de alumnos expulsados y añadimos "Bob" a ella. Esto nos permite ampliar fácilmente nuestro código simplemente añadiendo nuevos alborotadores a la colección de alumnos expulsados a lo largo del tiempo.
Volvamos a los métodos de lista; ahora tenemos el método actualizar en línea. Teniendo en cuenta que el método add()
simplemente desplaza todos los valores a la derecha después de sí mismo, tenemos que averiguar cómo actualizar un valor por índice. El método set(int index, Object value)
realiza esta acción:
main.java
12345678910111213141516package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> example = new ArrayList<>(); for (int i = 1; i <= 5; i++) { example.add(i); } System.out.println("List before modification: " + example); example.set(2, 28); System.out.println("List after modification: " + example); } }
Aquí es sencillo; sustituimos el elemento en el segundo índice por el número 28.
Otros métodos
Podríamos hablar de varios métodos para trabajar con esta lista durante mucho tiempo, pero nos llevaría mucho tiempo. Por lo tanto, puedes encontrar todos los métodos que necesites con documentación completa y explicaciones de su funcionamiento abriendo la clase ArrayList
en IntelliJ IDEA. Para ello, simplemente importa la librería ArrayList
, mantén pulsada la tecla comando (ctrl para Windows), y haz clic en ArrayList
. Aquí verás todos los campos y métodos de esta clase, lo que te permitirá familiarizarte con los métodos que podrías haberte perdido.
1. ¿Qué método podemos utilizar para añadir un elemento por índice?
2. ¿Qué método podemos utilizar para recuperar un elemento por índice?
3. ¿Qué método podemos utilizar para eliminar la primera aparición de un elemento?
4. ¿Qué método podemos utilizar para sustituir un elemento por el índice?
5. ¿Qué método podemos utilizar para comprobar la presencia de un elemento?
6. ¿Se puede crear una lista a partir de una matriz?
7. ¿Cómo podemos crear una lista a partir de una matriz?
¡Gracias por tus comentarios!