Set.remove în Java

remove scoate un element; removeAll face diferența a două mulțimi, retainAll intersecția. Toate spun dacă s-a schimbat ceva.

Sintaxă
boolean remove(Object o)
boolean removeAll(Collection<?> c)   // diferența
boolean retainAll(Collection<?> c)   // intersecția

Ce face Set.remove

remove(x) scoate elementul x și returnează true dacă exista. removeAll(c) scoate toate elementele care apar în c: rezultatul este diferența A − B. retainAll(c) păstrează doar elementele care apar și în c: rezultatul este intersecția A ∩ B.

Toate trei modifică mulțimea pe care sunt apelate. Când vrei să păstrezi originalul, fă mai întâi o copie: new TreeSet<>(a).

Parametri

Parametru Descriere
o Elementul de scos.
c Colecția folosită pentru diferență sau intersecție.

Ce returnează

true dacă mulțimea s-a modificat.

Exemple

Exemplul 1: Intersecție și diferență între două clase

import java.util.List;
import java.util.Set;
import java.util.TreeSet;

public class Main {
    public static void main(String[] args) {
        Set<String> engleza = new TreeSet<>(List.of("Ana", "Radu", "Elena", "Mihai"));
        Set<String> germana = new TreeSet<>(List.of("Elena", "Ioana", "Radu"));

        Set<String> ambele = new TreeSet<>(engleza);
        ambele.retainAll(germana);
        Set<String> doarEngleza = new TreeSet<>(engleza);
        doarEngleza.removeAll(germana);

        System.out.println("Ambele limbi: " + ambele);
        System.out.println("Doar engleză: " + doarEngleza);
        System.out.println("Original neschimbat: " + engleza);
    }
}

Rezultat

Ambele limbi: [Elena, Radu]
Doar engleză: [Ana, Mihai]
Original neschimbat: [Ana, Elena, Mihai, Radu]

Exemplul 2: remove returnează dacă a găsit elementul

import java.util.List;
import java.util.TreeSet;

public class Main {
    public static void main(String[] args) {
        TreeSet<String> abonati = new TreeSet<>(List.of("ana@exemplu.ro", "radu@exemplu.ro"));
        System.out.println(abonati.remove("radu@exemplu.ro") + " " + abonati);
        System.out.println(abonati.remove("radu@exemplu.ro") + " " + abonati);
        System.out.println(abonati.removeAll(List.of("x@exemplu.ro")) + " (nimic comun)");
    }
}

Rezultat

true [ana@exemplu.ro]
false [ana@exemplu.ro]
false (nimic comun)

Greșeli frecvente

  • Aplici retainAll/removeAll direct pe mulțimea originală și apoi ai nevoie de ea. Lucrează pe o copie.
  • Pe un Set<Integer>, crezi că remove(0) scoate „primul element”. Scoate valoarea 0, pentru că o mulțime nu are poziții.

Comenzi înrudite

  • Set: Interfața pentru mulțimi: colecții fără duplicate, în care întrebi rapid dacă un element există.
  • Set.add: Adaugă un element în mulțime doar dacă nu există deja; returnează true dacă a fost adăugat. addAll face reuniunea.
  • Collection.retainAll: retainAll păstrează doar elementele care apar și în altă colecție; containsAll verifică dacă le conține pe toate.
  • 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.