JavaRush /Blog Java /Random-ES /Colecciones en Java | Colecciones Java

Colecciones en Java | Colecciones Java

Publicado en el grupo Random-ES
¡Hola! En las últimas lecciones, hemos logrado grandes avances en el dominio de ArrayList. Sin embargo, durante este tiempo solo realizamos las operaciones más simples: eliminar, insertar y enviar a la consola. Por supuesto, este no es el final de la lista de problemas que enfrentan los desarrolladores al usar ArrayList . ¿ Recuerda la conferencia sobre matrices y la clase Arrays ? Fue desarrollado por los creadores de Java específicamente para resolver problemas comunes que encuentran los programadores cuando trabajan con matrices. ¿ Qué pasa con ArrayList ? Seguramente también hay alguna lista de tareas típicas para él. ¿Se implementaron todos en alguna clase separada o tendremos que escribir el comportamiento deseado manualmente cada vez? Por supuesto, no es necesario que lo escriba todo usted mismo. Las operaciones más comunes que se realizan al usar colecciones en Java ya se han implementado en una clase estática especial Colecciones. Colecciones de clases - 1

Colecciones en Java

"Colecciones" es un nombre genérico para varias estructuras de datos en Java. Los datos se pueden almacenar de muchas maneras diferentes. Hasta ahora sólo hemos estudiado la clase ArrayList , donde los datos se almacenan en una matriz. Más adelante nos familiarizaremos con el resto de colecciones. Ahora basta con comprender que la clase Colecciones está diseñada para funcionar no solo con ArrayList, sino también con otros tipos de colecciones en Java (de ahí, de hecho, su nombre). Entonces, ¿qué tareas te permite resolver la clase Colecciones cuando trabajas con ArrayList? La primera y más obvia es la clasificación. En la conferencia sobre matrices, vimos un ejemplo con números y ahora veamos un ejemplo con cadenas. Para ordenar el contenido de las colecciones, la clase Colecciones implementa el siguiente método sort():
public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercurio");
       String venus = new String("Venus");
       String earth = new String("Tierra");
       String mars = new String("Marte");
       String jupiter = new String("Júpiter");
       String saturn = new String("Saturno");
       String uranus = new String("Urano");
       String neptune = new String("Neptuno");

       ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
               jupiter, saturn, uranus, neptune));
       Collections.sort(solarSystem);
       System.out.println(solarSystem);

   }
}
Conclusión:

[Венера, Земля, Марс, Меркурий, Нептун, Сатурн, Уран, Юпитер]
¡Las líneas han sido ordenadas alfabéticamente! ¿Por qué en orden alfabético? La clase Stringestá programada para determinar exactamente cómo se comparan las cadenas entre sí (precisamente alfabéticamente). Para las clases que creará usted mismo, puede implementar su propio mecanismo de comparación, pero hablaremos de esto en otras conferencias. Además, la clase Colecciones le permite encontrar el elemento mínimo y máximo en un archivo ArrayList. Esto se hace usando los métodos min()y max():
public static void main(java.lang.String[] args) {

   ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
   System.out.println(Collections.max(numbers));
   System.out.println(Collections.min(numbers));

}
Conclusión:

7
1
Esto, por supuesto, es mucho más conveniente que escribir código manualmente para revisar todos los elementos y buscar el elemento más grande/más pequeño :) Otro método extremadamente útil es reverse(). Si necesitáramos “invertir” una lista para que los elementos estuvieran en orden inverso, ¿cómo lo haríamos? Probablemente no sería tan fácil escribir un algoritmo de este tipo usted mismo :) Afortunadamente, el método reverse()ya sabe cómo hacerlo. Por ejemplo, no nos gusta cómo el método sort()clasificó nuestros planetas en orden alfabético y queremos cambiar el orden al revés, de Z a A:
public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercurio");
       String venus = new String("Venus");
       String earth = new String("Tierra");
       String mars = new String("Marte");
       String jupiter = new String("Júpiter");
       String saturn = new String("Saturno");
       String uranus = new String("Urano");
       String neptune = new String("Neptuno");

       ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
               jupiter, saturn, uranus, neptune));
       Collections.sort(solarSystem);
       Collections.reverse(solarSystem);
       System.out.println(solarSystem);

   }
}
Conclusión:

[Юпитер, Уран, Сатурн, Нептун, Меркурий, Марс, Земля, Венера]
Por cierto, aquí hablamos a menudo de clasificación, orden de elementos, etc. ¿Y si nuestra tarea es exactamente la contraria? Por ejemplo, estamos intentando implementar un mecanismo de lotería. Hemos agregado 100 números al carrete, que deberían aparecer en la pantalla uno a la vez. Gana el primer participante que tache todos los números de su billete. Es muy fácil implementar dicho mecanismo usando el método shuffle():
public class Main {

   public static void main(java.lang.String[] args) {

       ArrayList<Integer> lottery = new ArrayList<>(100);
       for (int i = 1; i <= 100; i++) {

           lottery.add(i);//añadir números del 1 al 100 al tambor
       }

       Collections.shuffle(lottery);//mezcla
       System.out.println("¡Atención! ¡Los primeros 10 números salen del tambor!");
       for (int i = 0; i < 10; i++) {

           System.out.println(lottery.get(i));
       }

   }
}
Conclusión:

Внимание! Из барабана появляются первые 10 чисел!
32
61
4
81
25
8
66
35
42
71
¡Es así de simple! El problema está resuelto y nuestra parte del juego está escrita :) Ahora imaginemos una situación diferente. Anteriormente, creamos una lista solarSystemcon los planetas que figuran en ella. Y parece que nos conviene a todos, si no fuera por una cosa: ¡puedes eliminar elementos y añadir otros nuevos! Claramente este no es el comportamiento que esperamos: el sistema solar en nuestro programa debería permanecer sin cambios. La clase Colecciones tiene un método muy interesante: unmodifiableList(). Crea una versión inmutable de la lista dada. Será imposible agregarle o quitarle un elemento. En el caso de la lista de planetas del sistema solar, ¡esto es exactamente lo que necesitamos!
public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercurio");
       String venus = new String("Venus");
       String earth = new String("Tierra");
       String mars = new String("Marte");
       String jupiter = new String("Júpiter");
       String saturn = new String("Saturno");
       String uranus = new String("Urano");
       String neptune = new String("Neptuno");

       List<String> solarSystem = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
               jupiter, saturn, uranus, neptune)));
       solarSystem.add("Plutón");// intenta agregar un nuevo elemento
   }
}

Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.Collections$UnmodifiableCollection.add(Collections.java:1075)
	at Main.main(Main.java:21)
Error: ¡ solarSystemAhora no puedes agregar nada! Lo único a lo que debes prestar atención en este caso es que el tipo de variable debe ser List<>, y no ArrayList<>(este método devuelve un objeto exactamente de este tipo, común a todos los tipos de listas). Otra situación común que puede ocurrir durante el trabajo es que el programador agregó elementos en el orden incorrecto. Si esto sucediera, y Mercurio y Neptuno cambiaran inesperadamente de lugar, el siguiente método nos ayudará a corregir este error swap():
public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercurio");
       String venus = new String("Venus");
       String earth = new String("Tierra");
       String mars = new String("Marte");
       String jupiter = new String("Júpiter");
       String saturn = new String("Saturno");
       String uranus = new String("Urano");
       String neptune = new String("Neptuno");

       ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(neptune, venus, earth, mars
       , jupiter, saturn, uranus, mercury));// orden de planeta incorrecto
       System.out.println(solarSystem);

       Collections.swap(solarSystem, solarSystem.indexOf(mercury), solarSystem.indexOf(neptune));
       System.out.println(solarSystem);

   }
}
Pasamos nuestra lista al método swap(), así como los índices de los dos elementos que deben intercambiarse. Tenga en cuenta: el método funciona específicamente con índices y no con enlaces. Por lo tanto, aquí necesitábamos un método ArrayList.indexOf(). Conclusión:

[Нептун, Венера, Земля, Марс, Юпитер, Сатурн, Уран, Меркурий]

[Меркурий, Венера, Земля, Марс, Юпитер, Сатурн, Уран, Нептун]
Finalmente, conozcamos un método muy interesante: disjoint(). Comprueba si dos colecciones tienen intersecciones, es decir, al menos un elemento idéntico. Si no, devuelve true, en caso afirmativo, devuelve false.
public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercurio");
       String venus = new String("Venus");
       String earth = new String("Tierra");
       String mars = new String("Marte");
       String jupiter = new String("Júpiter");
       String saturn = new String("Saturno");
       String uranus = new String("Urano");
       String neptune = new String("Neptuno");

       ArrayList<String> solarSystemPart1 = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars));
       ArrayList<String> solarSystemPart2 = new ArrayList<>(Arrays.asList(jupiter, saturn, uranus, neptune));

       System.out.println(Collections.disjoint(solarSystemPart1, solarSystemPart2));

   }
}
Como puede ver, los elementos en nuestras dos listas son completamente diferentes, por lo que el programa genera true. Esta es una clase muy interesante y muy útil. Por ejemplo Arrays, él hace muchos trabajos rutinarios y menores para nosotros, lo que nos permite concentrarnos en otras cosas. Lea sobre esto en la documentación de Oracle , existen otros métodos allí.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION