List.remove în Java

Șterge elementul de la o poziție sau prima apariție a unei valori; elementele de după se mută la stânga.

Sintaxă
E remove(int index)
boolean remove(Object o)

Ce face List.remove

remove are două forme. remove(int index) șterge elementul de la poziția dată și îl returnează. remove(Object o) caută prima apariție a valorii o (comparând cu equals), o șterge și returnează true; dacă valoarea nu există, returnează false și lista rămâne la fel.

Atenție la List<Integer>: remove(2) alege forma cu int, deci șterge elementul de la poziția 2. Ca să ștergi valoarea 2, scrie remove(Integer.valueOf(2)).

După ștergere, elementele de la dreapta se mută cu o poziție la stânga, iar size() scade cu 1. Pentru a șterge toate elementele care respectă o condiție, folosește removeIf.

Parametri

Parametru Descriere
index Poziția elementului de șters (0 … size() - 1).
o Valoarea căutată; se șterge doar prima apariție.

Ce returnează

remove(int): elementul șters. remove(Object): true dacă a găsit și a șters valoarea.

Exemple

Exemplul 1: Ștergere după poziție și după valoare

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> fructe = new ArrayList<>(List.of("mere", "pere", "prune", "pere"));
        String sters = fructe.remove(0);
        System.out.println("Am șters " + sters + ": " + fructe);

        boolean gasit = fructe.remove("pere");      // doar prima apariție
        System.out.println(gasit + " " + fructe);
        System.out.println("kiwi? " + fructe.remove("kiwi"));
    }
}

Rezultat

Am șters mere: [pere, prune, pere]
true [prune, pere]
kiwi? false

Exemplul 2: Capcana List

remove(2) șterge poziția 2 (valoarea 30), iar remove(Integer.valueOf(10)) șterge valoarea 10.

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> numere = new ArrayList<>(List.of(10, 20, 30, 40));
        numere.remove(2);
        System.out.println("După remove(2): " + numere);
        numere.remove(Integer.valueOf(10));
        System.out.println("După remove(Integer.valueOf(10)): " + numere);
    }
}

Rezultat

După remove(2): [10, 20, 40]
După remove(Integer.valueOf(10)): [20, 40]

Exemplul 3: Ștergere în buclă, de la coadă spre început

Parcurgem invers, ca ștergerea să nu mute elementele pe care încă nu le-am verificat.

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> note = new ArrayList<>(List.of(4, 8, 3, 10, 5));
        for (int i = note.size() - 1; i >= 0; i--) {
            if (note.get(i) < 5) {
                note.remove(i);
            }
        }
        System.out.println("Note de trecere: " + note);
    }
}

Rezultat

Note de trecere: [8, 10, 5]

Greșeli frecvente

  • Ștergi într-o buclă for crescătoare cu i++. După fiecare ștergere elementul următor ajunge pe poziția i și este sărit. Mergi invers sau folosește removeIf.
  • Ștergi cu lista.remove(x) în interiorul unui for-each peste aceeași listă: apare ConcurrentModificationException.
  • Pe List<Integer> scrii remove(5) crezând că ștergi valoarea 5.

Comenzi înrudite

  • List.removeFirst: Scoate și returnează primul sau ultimul element al listei; pe o listă goală aruncă NoSuchElementException.
  • List.removeAll: removeAll șterge toate elementele care apar în altă colecție; retainAll le păstrează doar pe acestea.
  • Collection.removeIf: Șterge din colecție toate elementele pentru care condiția dată este adevărată. Returnează true dacă s-a șters ceva.
  • Iterator.remove: Șterge din colecție elementul returnat ultima dată de next(). Este felul sigur de a șterge în timpul parcurgerii.
  • List.size: size spune câte elemente are lista, isEmpty verifică dacă e goală, iar clear șterge toate elementele.