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ă
forcrescătoare cui++. După fiecare ștergere elementul următor ajunge pe pozițiaiși este sărit. Mergi invers sau foloseșteremoveIf. - Ștergi cu
lista.remove(x)în interiorul unuifor-eachpeste aceeași listă: apareConcurrentModificationException. - Pe
List<Integer>scriiremove(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.