Algorismes
La classe Collections conté mètodes estàtics que operen sobre col·leccions ja fetes. Són polimòrfics: estan escrits contra les interfícies, i per tant el mateix sort() serveix per a un ArrayList i per a una LinkedList. La majoria treballen amb List, perquè necessiten posicions; uns quants accepten qualsevol Collection.
Ordenar
List<String> noms = new ArrayList<>(List.of("Carla", "Aina", "Bernat"));
noms.sort(Comparator.naturalOrder()); // forma actual: mètode de List
Collections.sort(noms); // equivalent clàssic
Totes dues ordenen la llista en el lloc, no en retornen una de nova. Si vols conservar l’original, ordena’n una còpia o fes servir stream().sorted().toList().
L’ordenació és estable: dos elements que la comparació considera iguals conserven l’ordre que ja tenien. Per això pots ordenar primer per nom i després per grup, i dins de cada grup els noms continuen ordenats.
Amb un comparador ordenes per qualsevol criteri, com es veu a Comparació d’objectes:
noms.sort(Comparator.comparing(String::length));
Cercar
Collections.binarySearch(noms, "Bernat");
La cerca binària és molt més ràpida que recórrer la llista, però només funciona si la llista ja està ordenada pel mateix criteri amb què cerques. Sobre una llista desordenada no dona error: retorna un resultat sense sentit.
Si troba l’element, retorna la seva posició. Si no el troba, retorna un negatiu que codifica on hauria d’anar: -(punt d'inserció) - 1. Per tant, un resultat negatiu vol dir “no hi és”, i -resultat - 1 és la posició on l’hauries d’inserir per mantenir l’ordre.
Per a llistes sense ordenar, indexOf() fa una cerca lineal i contains() només diu si hi és.
Consultar
| Mètode | Què fa |
|---|---|
min(coll), max(coll) | El menor i el major, per ordre natural o amb un Comparator |
frequency(coll, obj) | Quantes vegades hi apareix un element |
disjoint(c1, c2) | Si les dues col·leccions no tenen cap element en comú |
Modificar en bloc
| Mètode | Què fa |
|---|---|
reverse(list) | Inverteix l’ordre |
shuffle(list) | Barreja a l’atzar, útil per a cartes o preguntes |
swap(list, i, j) | Intercanvia dues posicions |
fill(list, obj) | Substitueix tots els elements pel mateix valor |
copy(desti, origen) | Copia, i la llista de destí ha de ser almenys igual de llarga |
addAll(coll, e1, e2, ...) | Afegeix diversos elements d’un cop |
nCopies(n, obj) | Una llista immutable amb el mateix element repetit n vegades |
Vistes immutables
Collections.unmodifiableList(list) retorna una vista de només lectura: no és una còpia, i si algú modifica la llista original la vista també canvia. Serveix per exposar una col·lecció interna sense deixar que la modifiquin des de fora.
public List<Alumne> getAlumnes() {
return Collections.unmodifiableList(alumnes);
}
Quan el que vols és una còpia realment independent i immutable, fes servir List.copyOf(alumnes). I per a llistes literals, List.of() i Set.of() han substituït els antics Collections.emptyList() i Collections.singletonList().