Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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ètodeQuè 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ètodeQuè 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().

Referències

Last change: , commit: 87dfa51