John Squirrels
Niveau 41
San Francisco

Java-set

Gepubliceerd in de groep Willekeurig
Set is een interface in het Java Collection Framework. U kunt Java Set gebruiken om ongeordende verzamelingen met unieke elementen te implementeren. In dit artikel gaan we kijken naar deze interface en de implementaties ervan in de Java-taal, methoden om met een set te werken, en geven we ook enkele voorbeelden.

Wat is Javaset

Set is een interface van het Java Collection Framework, maar Set is geen geordende verzameling, in tegenstelling tot List . Dat betekent dat Java Set- elementen zonder een bepaalde volgorde worden bewaard. Er is dus geen controle over de positie waar u een element kunt invoegen. Je hebt ook geen toegang tot elementen via hun index. Wiskundig gezien is een set een verzameling unieke elementen. In feite is dit een ongeordende verzameling (ongeordende verzameling), waarin identieke elementen niet kunnen worden opgeslagen. Als u met opzet een gedupliceerd element aan een Set toevoegt , wordt deze actie genegeerd en verandert de Set niet. Het is echter toegestaan ​​om er één nulelement in op te slaan.

Stel implementaties in

Java Set is een interface, dus u moet een van de implementaties ervan gebruiken om objecten te maken. Dit zijn HashSet , TreeSet en LinkedHashSet . In Set s wordt elk element in slechts één instantie opgeslagen en verschillende implementaties van Set gebruiken een andere volgorde voor het opslaan van elementen. In een HashSet wordt de volgorde van elementen bepaald door een complex algoritme. Als opslagvolgorde belangrijk voor u is, gebruik dan een TreeSet- container, waarin objecten in oplopende volgorde in vergelijkingsvolgorde worden gesorteerd, of een LinkedHashSet, waarin elementen naast volgorde worden opgeslagen. Sets worden vaak gebruikt voor het testen van lidmaatschap, zodat u gemakkelijk kunt controleren of een object tot een bepaalde set behoort, dus in de praktijk wordt meestal gekozen voor een HashSet- implementatie die is geoptimaliseerd voor snel opzoeken. HashSet is een verzameling die hun hash-waarden gebruikt die worden geretourneerd door de methode hashCode() om elementen intern op te slaan. Dat wil zeggen, in de HashSet<E> wordt het object HashMap<E, Object> opgeslagen, waarin de waarden van de HashSet als sleutels worden opgeslagen. Met behulp van hash-codes kunt u snel elementen uit een set zoeken, toevoegen en verwijderen . LinkedHashSet is een HashSetdie ook elementen opslaat in een gekoppelde lijst. Een normale HashSet handhaaft de volgorde van elementen niet. Ten eerste bestaat het officieel gewoon niet, en ten tweede kan zelfs de interne orde drastisch veranderen als er maar één element wordt toegevoegd. En u kunt een iterator van LinkedHashSet krijgen en deze gebruiken om alle elementen te doorlopen in de exacte volgorde waarin ze aan de LinkedHashSet zijn toegevoegd . Niet vaak, maar soms kan het heel nodig zijn. Een TreeSet is een verzameling die elementen opslaat als een op waarde geordende boom. Binnen de TreeSet<E> bevindt zich een TreeMap<E, Object> die al deze waarden opslaat. En deze TreeMapgebruikt een rood-zwart gebalanceerde binaire boom om elementen op te slaan. Daarom heeft het zeer snelle add() , remove() , contain() operaties.

Maak een ingesteld object

Om een ​​set- object te maken, kunt u een van de volgende formulieren gebruiken:

Set<Integer> intSet = new HashSet<>();
Set<String> vSet = new HashSet<>();
Set mySet = new LinkedHashSet();
HashSet<String> myHashset = new HashSet<>();
Hier is een eenvoudig voorbeeld, waarbij we 2 Set s, HashSet en LinkedHashSet maken , en aan elk 5 elementen toevoegen. Hiervoor kunnen we de methode add() gebruiken .

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);
    }
}
Hier is de uitvoer van het programma:
[Alex, Igor, Stuart, Johnny, Bel] [Stuart, Alex, Johnny, Igor, Bel]
Zoals we hierboven vermeldden, handhaaft HashSet de volgorde van elementen niet, maar LinkedHashSet wel. Het was LinkedHashSet die ons de elementen gaf in de volgorde waarin we ze naar de set schreven.

Java Set-methoden

Hier zijn enkele van Java Set belangrijke methoden:
  • booleaanse toevoeging(E e) . Voegt het opgegeven element toe aan de set als het nog niet aanwezig is (optionele bewerking).

  • booleaanse verwijdering(Object o) . Verwijdert het opgegeven element uit deze set als het aanwezig is (optionele bewerking).

  • boolean removeAll(Collectie c) . Verwijdert uit deze set alle elementen die zijn opgenomen in de opgegeven verzameling (optionele bewerking).

  • boolean retainAll(Collectie c) . Behoudt alleen de elementen in deze set die deel uitmaken van de opgegeven verzameling (optionele bewerking).

  • nietig duidelijk() . Verwijdert alle elementen uit de set.

  • Iterator-iterator() . Retourneert een iterator over de elementen in deze set.

  • int-grootte() . het wordt gebruikt om het aantal elementen in de set te krijgen.

  • boolean isEmpty() . om te controleren of Set leeg is of niet.

  • boolean bevat(Object o) . Retourneert waar als deze set het opgegeven element bevat.

  • Iterator-iterator() . Retourneert een iterator over de elementen in deze set. De elementen worden in willekeurige volgorde geretourneerd.

  • Object[] toArray() . Retourneert een matrix die alle elementen in deze set bevat. Als deze set enige garantie geeft over de volgorde van de elementen die worden geretourneerd door de iterator, moet deze methode de elementen in dezelfde volgorde retourneren.

De methoden zijn vergelijkbaar met die van ArrayList , behalve dat de methode add(Object o) alleen een object aan de set toevoegt als het er nog niet is. De geretourneerde waarde van de methode is waar als het object is toegevoegd, en anders onwaar. Er zijn ook enkele methoden geërfd van Collection<> Interface: parallelStream() , removeIf() , stream() en forEach() methode geërfd van java.lang.Iterable Interface.

Voorbeeld van Java Set hoofdbewerkingen

In dit voorbeeld maken we een reeks tekenreeksen en geven deze vervolgens door aan mySet met behulp van de bewerking Arrays.asList . Vervolgens verwijderen we nog een paar elementen en voegen we er nog een paar toe. In dit geval bestaat een van de elementen in de set al: deze wordt niet toegevoegd. We zullen ook de bewerkingen proberen van het controleren op leegte isEmpty() , het bepalen van de grootte van de set size() en het wissen van de set van alle elementen 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());

   }
}
De uitvoer van het programma is hier:
[Alex, Igor, Stuart, Tanya, Johnny, Ivy] [Alex, Tanya, Johnny, Ivy] [Alex, Dasha, Tanya, Johnny, Ivy] Het aantal setelementen = 5 Is mySet leeg? false Is Igor op de set? false Is Johnny op de set? true Is mySet nu leeg? WAAR

Voorbeeld met LinkedHashSet en ingesteld op Array

Laten we een ander programma schrijven. Daarin zullen we een set maken op basis van de LinkedHashSet , er elementen aan toevoegen en de set vervolgens converteren naar een array.

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]);

       }
   }
Hier is de uitvoer van het programma:
[C, D, E, F, G, A, B] false Print onze set met verwijderde elementen: [C, D, E, G, A, B] Nieuwe array uit set: [C, D, E, G, A, B] C

Voorbeeld geven met iterator

Laten we een set maken, deze vervolgens afdrukken met een iterator en vervolgens alle even getallen eruit verwijderen, ook met behulp van een 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);

       }
}
De uitvoer van het programma is hier:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 3, 5, 7, 9

Voorbeeld met TreeSet

Als sorteren belangrijk voor je is, gebruik dan de TreeSet- implementatie. In dit korte voorbeeld vullen we de set in met de namen van vrienden, net als in de vorige voorbeelden. In een gesorteerde TreeSet worden de elementen echter onmiddellijk in gesorteerde volgorde geschreven. In dit geval worden de namen alfabetisch weergegeven.

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);

   }
De uitvoer is:
[Alex, Bel, Igor, Johnny, Stuart]

Korte conclusies

  • De Java Set- interface maakt deel uit van het Java Collections Framework.

  • Geïmplementeerde klassen: AbstractSet , ConcurrentHashMap.KeySetView , ConcurrentSkipListSet , CopyOnWriteArraySet , EnumSet , HashSet , JobStateReasons , LinkedHashSet , TreeSet .

  • De meest populaire Set- implementaties zijn HashSet , LinkedHashSet en TreeSet .

  • De volgorde van HashSet- elementen wordt bepaald door een complex algoritme. Als opslagvolgorde belangrijk voor je is, gebruik dan een TreeSet- container, waarin objecten in oplopende volgorde in vergelijkingsvolgorde worden gesorteerd, of een LinkedHashSet , waarin elementen in aanvullende volgorde worden opgeslagen.

  • Meestal worden sets gebruikt om het lidmaatschap te testen. Dat wil zeggen om te controleren of een object in wiskundige zin tot een bepaalde verzameling behoort. Dus van alle Set- implementaties in de praktijk wordt meestal gekozen voor HashSet . Deze implementatie is geoptimaliseerd voor snel zoeken.

  • U kunt geen dubbele elementen aan een set toevoegen, dus u kunt implementaties van de Set- interface gebruiken om unieke elementen op te slaan.

  • Met Set kunt u slechts één null-element toevoegen.

  • Set is geen lijst en ondersteunt geen indexen of posities van zijn elementen.

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