John Squirrels
Nivel
San Francisco

Set Java

Publicat în grup
Set este o interfață în cadrul Java Collection Framework. Puteți folosi Java Set pentru a implementa colecții neordonate cu elemente unice. În acest articol, vom analiza această interfață și implementările sale în limbajul Java, metodele de lucru cu un set și vom oferi, de asemenea, câteva exemple.

Ce este Java Set

Set este o interfață din cadrul Java Collection Framework, dar Set nu este o colecție ordonată, spre deosebire de List . Aceasta înseamnă că elementele Java Set sunt păstrate fără o anumită ordine. Deci nu există control asupra poziției în care puteți insera un element. De asemenea, nu puteți accesa elemente după indexul lor. Din punct de vedere matematic, un set este o colecție de elemente unice. De fapt, aceasta este o Colecție neordonată (Colecție neordonată), în care elemente identice nu pot fi stocate. Dacă adăugați în mod intenționat un element duplicat la un set , această acțiune va fi ignorată și setul nu se va modifica. Cu toate acestea, este permisă stocarea unui element nul în el.

Setați implementări

Java Set este o interfață, așa că trebuie să utilizați una dintre implementările sale pentru a crea obiecte. Acestea sunt HashSet , TreeSet și LinkedHashSet . În Set s, fiecare element este stocat într-o singură instanță, iar implementările diferite ale Set folosesc o ordine diferită pentru stocarea elementelor. Într-un HashSet , ordinea elementelor este determinată de un algoritm complex. Dacă ordinea de stocare este importantă pentru dvs., utilizați un container TreeSet , care stochează obiectele sortate în ordine crescătoare în ordine de comparație sau un LinkedHashSet, care stochează elemente în ordine suplimentară. Seturile sunt adesea folosite pentru testarea apartenenței, astfel încât să puteți verifica cu ușurință dacă un obiect aparține unui set dat, așa că, în practică, este de obicei aleasă o implementare HashSet care este optimizată pentru căutare rapidă. HashSet este o colecție care își folosește valorile hash returnate de metoda hashCode() pentru a stoca elemente în interior. Adică, în interiorul HashSet<E> , este stocat obiectul HashMap<E, Object> , care stochează valorile HashSet-ului ca chei. Utilizarea codurilor hash vă permite să căutați, să adăugați și să eliminați rapid elemente dintr-un set . LinkedHashSet este un HashSetcare stochează și elemente într-o listă legată. Un HashSet normal nu menține ordinea elementelor. În primul rând, oficial pur și simplu nu există și, în al doilea rând, chiar și ordinea internă se poate schimba dramatic atunci când este adăugat un singur element. Și puteți obține un iterator de la LinkedHashSet și îl puteți folosi pentru a parcurge toate elementele în ordinea exactă în care au fost adăugate la LinkedHashSet . Nu des, dar uneori poate fi foarte necesar. Un TreeSet este o colecție care stochează elemente ca un arbore ordonat în funcție de valori. În interiorul TreeSet<E> se află un TreeMap<E, Object> care stochează toate aceste valori. Și acest TreeMapfolosește un arbore binar echilibrat roșu-negru pentru a stoca elemente. Prin urmare, are operații foarte rapide add() , remove() , contains() .

Creați un obiect set

Pentru a crea un obiect set , puteți folosi unul dintre următoarele forme:

Set<Integer> intSet = new HashSet<>();
Set<String> vSet = new HashSet<>();
Set mySet = new LinkedHashSet();
HashSet<String> myHashset = new HashSet<>();
Iată un exemplu simplu, în care creăm 2 Set s, HashSet și LinkedHashSet și adăugăm în fiecare pentru 5 elemente. Putem folosi metoda add() pentru aceasta.

import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;

public class HashSetTest {
    public static void main(String[] args) {
        Set mySet = new HashSet();
        Set mySet2 = new LinkedHashSet();
//adding some string elements
        mySet.add("Stuart");
        mySet.add("Alex");
        mySet.add("Johnny");
        mySet.add("Igor");
        mySet.add("Bel");
        System.out.println(mySet);
        mySet2.add("Stuart");
        mySet2.add("Alex");
        mySet2.add("Johnny");
        mySet2.add("Igor");
        mySet2.add("Bel");
        System.out.println(mySet2);
    }
}
Iată rezultatul programului:
[Alex, Igor, Stuart, Johnny, Bel] [Stuart, Alex, Johnny, Igor, Bel]
După cum am menționat mai sus, HashSet nu menține ordinea elementelor, dar LinkedHashSet o face. LinkedHashSet a fost cel care ne-a oferit elementele în ordinea în care le-am scris în set.

Metode de set Java

Iată câteva dintre metodele importante ale Java Set :
  • adaugă boolean(E e) . Adaugă elementul specificat la set dacă nu este deja prezent (operație opțională).

  • boolean remove(Obiect o) . Îndepărtează elementul specificat din acest set dacă este prezent (operație opțională).

  • boolean removeAll(Colecția c) . Îndepărtează din acest set toate elementele sale care sunt conținute în colecția specificată (operație opțională).

  • boolean retainAll(Colecția c) . Reține doar elementele din acest set care sunt conținute în colecția specificată (operație opțională).

  • void clear() . Îndepărtează toate elementele din set.

  • Iterator iterator() . Returnează un iterator peste elementele din acest set.

  • int dimensiune() . este folosit pentru a obține numărul de elemente din Set.

  • boolean isEmpty() . pentru a verifica dacă Set este gol sau nu.

  • boolean conține(Obiect o) . Returnează adevărat dacă acest set conține elementul specificat.

  • Iterator iterator() . Returnează un iterator peste elementele din acest set. Elementele sunt returnate în nicio ordine anume.

  • Object[] toArray() . Returnează o matrice care conține toate elementele din acest set. Dacă acest set oferă garanții cu privire la ordinea în care elementele sale sunt returnate de iteratorul său, această metodă trebuie să returneze elementele în aceeași ordine.

Metodele sunt similare cu cele ale ArrayList , cu excepția faptului că metoda add(Object o) adaugă un obiect la set doar dacă acesta nu este deja acolo. Valoarea returnată a metodei este adevărată dacă obiectul a fost adăugat și falsă în caz contrar. Există, de asemenea, câteva metode moștenite de la Collection<> Interface: parallelStream() , removeIf() , stream() și metoda forEach() moștenite de la java.lang.Iterable Interface.

Exemplu de operații principale Java Set

În acest exemplu, creăm o matrice de șiruri de caractere și apoi o transmitem către mySet folosind operația Arrays.asList . Apoi mai eliminăm câteva elemente și mai adăugăm câteva. În acest caz, unul dintre elementele din set există deja: nu va fi adăugat. Vom încerca, de asemenea, operațiunile de verificare a golului isEmpty() , determinând dimensiunea setului size() și ștergând setul de toate elementele clear() .

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class HashSetTest2 {
   public static void main(String[] args) {
       //creating a string Array with some names
       String [] friends =  {"Stuart", "Ivy", "Johnny", "Alex", "Igor", "Tanya"};
       //creating a new set and adding elements from string array into it
       Set<String> mySet = new HashSet<>(Arrays.asList(friends));
       System.out.println(mySet);
       //removing two elements from the set
       mySet.remove("Igor");
       mySet.remove("Stuart");

       System.out.println(mySet);

       //adding 2 new Elements into set
       mySet.add("Dasha");
       mySet.add("Alex"); //it's second Alex, can't be added
       System.out.println(mySet);
       //cheking the size of mySet
       int size = mySet.size();
       System.out.println("The quantity of set's elements = " + size);
       //Checking if the set is empty
       System.out.println("Is mySet empty? " + mySet.isEmpty());
       //checking if some elements are in set
       System.out.println("Is Igor in set? " + mySet.contains("Igor"));
       System.out.println("Is Johnny in set? "+ mySet.contains("Johnny"));
       //deleting all elements from the set
       mySet.clear();
       System.out.println("Is mySet empty now? " + mySet.isEmpty());

   }
}
Ieșirea programului este aici:
[Alex, Igor, Stuart, Tanya, Johnny, Ivy] [Alex, Tanya, Johnny, Ivy] [Alex, Dasha, Tanya, Johnny, Ivy] Cantitatea de elemente ale setului = 5 MySet este gol? false Igor este în platou? false Johnny este în platou? adevărat MySet este gol acum? Adevărat

Exemplu cu LinkedHashSet și setat la Array

Să scriem alt program. În el, vom crea un set bazat pe LinkedHashSet , vom adăuga elemente la acesta și apoi vom converti setul într-o matrice.

import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
   public class LinkedHashSet3 {
       public static void main(String[] args) {
           Set<String> set = new LinkedHashSet<>();
           set.add("C");
           set.add("D");
           set.add("E");
           set.add("F");
           set.add("G");
           set.add("A");
           set.add("B");
           System.out.println(set);
           set.remove("F");// removing an element from our set
           set.remove("C sharp");//trying to remove element that isn't in set
           System.out.println(set.remove("C sharp"));
           System.out.println("Print our set with elements removed: ");
           System.out.println(set);

//set to array
           String strArray[] = set.toArray(new String[set.size()]);
           System.out.println("New Array from set: ");
           System.out.println(Arrays.toString(strArray));
           System.out.println(strArray[0]);

       }
   }
Iată rezultatul programului:
[C, D, E, F, G, A, B] false Tipăriți setul nostru cu elementele eliminate: [C, D, E, G, A, B] Matrice nouă din set: [C, D, E, G, A, B] C

Setați exemplul cu iteratorul

Să creăm un set, apoi să-l tipărim folosind un iterator și apoi să eliminăm toate numerele pare din el, folosind tot un iterator.

import java.util.*;

public class SetTest5
{
   public static void main(String[] args)
   {

       Set<Integer> mySet = new HashSe<>();
       for(int i = 0; i < 10; i++)
           mySet.add(i);

       Iterator iterator = mySet.iterator();

       //simple iteration
       while(iterator.hasNext()){
           int i = (int) iterator.next();
       }
       System.out.println(" " + mySet);

       //modification of mySet using iterator - removing all even numbers
       iterator = mySet.iterator();
       while(iterator.hasNext()){
           int x = (int) iterator.next();
           if(x%2 == 0) iterator.remove();
       }
       System.out.println(mySet);

       }
}
Ieșirea programului este aici:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 3, 5, 7, 9

Exemplu cu TreeSet

Dacă sortarea este importantă pentru dvs., atunci utilizați implementarea TreeSet . În acest scurt exemplu, vom completa setul cu numele prietenilor, ca în exemplele anterioare. Cu toate acestea, într-un TreeSet sortat , elementele vor fi imediat scrise în ordine sortată. În acest caz, numele vor fi afișate în ordine alfabetică.

import java.util.Set;
import java.util.TreeSet;
public class TreeSetTest {

   public static void main(String[] args) {

       Set mySet = new TreeSet<>();
       mySet.add("Stuart");
       mySet.add("Alex");
       mySet.add("Johnny");
       mySet.add("Igor");
       mySet.add("Bel");
       System.out.println(mySet);

   }
Ieșirea este:
[Alex, Bel, Igor, Johnny, Stuart]

Concluzii scurte

  • Interfața Java Set face parte din cadrul Java Collections Framework.

  • Clase implementate: AbstractSet , ConcurrentHashMap.KeySetView , ConcurrentSkipListSet , CopyOnWriteArraySet , EnumSet , HashSet , JobStateReasons , LinkedHashSet , TreeSet .

  • Cele mai populare implementări Set sunt HashSet , LinkedHashSet și TreeSet .

  • Ordinea elementelor HashSet este determinată de un algoritm complex. Dacă ordinea de stocare este importantă pentru dvs., utilizați un container TreeSet , care stochează obiectele sortate crescător în ordine de comparație, sau un LinkedHashSet , care stochează elemente în ordine suplimentară.

  • Cel mai adesea, seturile sunt folosite pentru a testa calitatea de membru. Adică pentru a verifica dacă un obiect aparține unei mulțimi date în sens matematic. Deci, cel mai adesea dintre toate implementările Set în practică, HashSet este de obicei ales. Această implementare este optimizată pentru căutare rapidă.

  • Nu puteți adăuga elemente duplicate la un set, așa că puteți utiliza implementări ale interfeței Set pentru a stoca elemente unice.

  • Set vă permite să adăugați un singur element nul.

  • Set nu este o listă și nu acceptă indici sau poziții ale elementelor sale.

Comentarii
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION