John Squirrels
Nivå
San Francisco

Java Set

Publicerad i gruppen
Set är ett gränssnitt i Java Collection Framework. Du kan använda Java Set för att implementera oordnade samlingar med unika element. I den här artikeln kommer vi att titta på det här gränssnittet och dess implementeringar i Java-språket, metoder för att arbeta med en uppsättning och även ge några exempel.

Vad är Java Set

Set är ett gränssnitt från Java Collection Framework, men Set är inte en beställd samling, till skillnad från List . Det betyder att Java Set- element hålls utan en viss ordning. Det finns alltså ingen kontroll över positionen där du kan infoga ett element. Du kan inte heller komma åt element genom deras index. Matematiskt är en uppsättning en samling unika element. I själva verket är detta en oordnad samling (oordnad samling), där identiska element inte kan lagras. Om du avsiktligt lägger till ett dubblettelement till en uppsättning kommer denna åtgärd att ignoreras och uppsättningen kommer inte att ändras. Det är dock tillåtet att lagra ett nollelement i det.

Ställ in implementeringar

Java Set är ett gränssnitt, så du måste använda en av dess implementeringar för att skapa objekt. Dessa är HashSet , TreeSet och LinkedHashSet . I Set s lagras varje element i endast en instans, och olika implementeringar av Set använder en annan ordning för att lagra element. I en HashSet bestäms ordningen på elementen av en komplex algoritm. Om lagringsordning är viktig för dig, använd en TreeSet- behållare, som lagrar objekt sorterade i stigande ordning i jämförelseordning, eller en LinkedHashSet, som lagrar element i tilläggsordning. Uppsättningar används ofta för medlemskapstestning så att man enkelt kan kontrollera om ett objekt tillhör en given uppsättning, så i praktiken brukar man välja en HashSet- implementation som är optimerad för snabb uppslagning. HashSet är en samling som använder sina hashvärden som returneras av hashCode() -metoden för att lagra element internt. Det vill säga, inuti HashSet<E> lagras HashMap<E, Object>-objektet, vilket lagrar värdena för HashSet som nycklar . Genom att använda hashkoder kan du snabbt söka, lägga till och ta bort element från en uppsättning . LinkedHashSet är ett HashSetsom också lagrar element i en länkad lista. En normal HashSet upprätthåller inte elementordningen. För det första, officiellt finns det helt enkelt inte, och för det andra kan även den interna ordningen förändras dramatiskt när bara ett element läggs till. Och du kan få en iterator från LinkedHashSet och använda den för att gå igenom alla element i exakt den ordning som de lades till i LinkedHashSet . Inte ofta, men ibland kan det vara väldigt nödvändigt. En TreeSet är en samling som lagrar element som ett värdeordnat träd. Inuti TreeSet<E> finns en TreeMap<E, Object> som lagrar alla dessa värden. Och denna TreeMapanvänder ett röd-svart balanserat binärt träd för att lagra element. Därför har den mycket snabba add() , remove() , contains() operationer.

Skapa ett uppsättningsobjekt

För att skapa ett uppsättningsobjekt kan du använda något av följande formulär:
Set<Integer> intSet = new HashSet<>();
Set<String> vSet = new HashSet<>();
Set mySet = new LinkedHashSet();
HashSet<String> myHashset = new HashSet<>();
Här är ett enkelt exempel, där vi skapar 2 Set s, HashSet och LinkedHashSet , och lägger till i varje för 5 element. Vi kan använda metoden add() för detta.
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);
    }
}
Här är resultatet av programmet:
[Alex, Igor, Stuart, Johnny, Bel] [Stuart, Alex, Johnny, Igor, Bel]
Som vi nämnde ovan upprätthåller inte HashSet ordningen på element, men det gör LinkedHashSet . Det var LinkedHashSet som gav oss elementen i den ordning vi skrev dem till setet.

Java-uppsättningsmetoder

Här är några viktiga Java Set- metoder:
  • boolesk add(E e) . Lägger till det angivna elementet till uppsättningen om det inte redan finns (valfritt).

  • boolean remove(Object o) . Tar bort det angivna elementet från denna uppsättning om det finns (valfri operation).

  • boolean removeAll(Collection c) . Tar bort från denna uppsättning alla dess element som finns i den angivna samlingen (valfri operation).

  • boolean retainAll(Samling c) . Behåller endast de element i denna uppsättning som finns i den angivna samlingen (valfri operation).

  • void clear() . Tar bort alla element från setet.

  • Iterator iterator() . Returnerar en iterator över elementen i denna uppsättning.

  • int size() . den används för att få antalet element i uppsättningen.

  • boolean isEmpty() . för att kontrollera om Set är tomt eller inte.

  • boolean innehåller(Objekt o) . Returnerar sant om denna uppsättning innehåller det angivna elementet.

  • Iterator iterator() . Returnerar en iterator över elementen i denna uppsättning. Elementen returneras i ingen speciell ordning.

  • Objekt[] toArray() . Returnerar en array som innehåller alla element i denna uppsättning. Om denna uppsättning ger några garantier för vilken ordning dess element returneras av dess iterator, måste denna metod returnera elementen i samma ordning.

Metoderna liknar de i ArrayList , förutom att add(Object o) -metoden bara lägger till ett objekt till setet om det inte redan finns där. Metodens returvärde är sant om objektet har lagts till, och falskt annars. Det finns också några metoder som ärvts från Collection<> Interface: parallellStream() , removeIf() , stream() och forEach() -metoden som ärvts från java.lang.Iterable Interface.

Java Set huvudoperationer exempel

I det här exemplet skapar vi en array av strängar och skickar den sedan till mySet med Arrays.asList -operationen. Sedan tar vi bort ett par element till och lägger till ett par till. I det här fallet finns redan ett av elementen i uppsättningen: det kommer inte att läggas till. Vi kommer också att prova operationerna för att kontrollera om det finns tomhet isEmpty() , bestämma storleken på set size() och rensa uppsättningen av alla element 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());

   }
}
Resultatet av programmet är här:
[Alex, Igor, Stuart, Tanya, Johnny, Ivy] [Alex, Tanya, Johnny, Ivy] [Alex, Dasha, Tanya, Johnny, Ivy] Mängden sets element = 5 Är min Set tom? false Är Igor i set? false Är Johnny i uppsättning? sant Är mySet tomt nu? Sann

Exempel med LinkedHashSet och satt till Array

Låt oss skriva ett annat program. I den kommer vi att skapa en uppsättning baserat på LinkedHashSet , lägga till element till den och sedan konvertera uppsättningen till en 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]);

       }
   }
Här är resultatet av programmet:
[C, D, E, F, G, A, B] false Skriv ut vårt set med element borttagna: [C, D, E, G, A, B] Ny array från set: [C, D, E, G, A, B] C

Ge exempel med iterator

Låt oss skapa en uppsättning, sedan skriva ut den med en iterator och sedan ta bort alla jämna nummer från den, även med en 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);

       }
}
Resultatet av programmet är här:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 3, 5, 7, 9

Exempel med TreeSet

Om sortering är viktigt för dig, använd sedan TreeSet- implementering. I detta korta exempel kommer vi att fylla i uppsättningen med namnen på vänner, som i de tidigare exemplen. Men i en sorterad TreeSet kommer elementen omedelbart att skrivas i sorterad ordning. I det här fallet kommer namnen att visas alfabetiskt.
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);

   }
Utgången är:
[Alex, Bel, Igor, Johnny, Stuart]

Korta slutsatser

  • Java Set -gränssnittet är en del av Java Collections Framework.

  • Implementerade klasser: AbstractSet , ConcurrentHashMap.KeySetView , ConcurrentSkipListSet , CopyOnWriteArraySet , EnumSet , HashSet , JobStateReasons , LinkedHashSet , TreeSet .

  • De mest populära Set- implementeringarna är HashSet , LinkedHashSet och TreeSet .

  • HashSet- elementordningen bestäms av en komplex algoritm. Om lagringsordning är viktig för dig, använd en TreeSet- behållare, som lagrar objekt sorterade i stigande ordning i jämförelseordning, eller en LinkedHashSet , som lagrar element i tilläggsordning.

  • Oftast används set för att testa medlemskap. Det vill säga att kontrollera om ett objekt tillhör en given mängd i matematisk mening. Så oftast av alla Set- implementeringar i praktiken väljs HashSet vanligtvis. Denna implementering är optimerad för snabb sökning.

  • Du kan inte lägga till dubbletter av element till en uppsättning, så du kan använda implementeringar av Set- gränssnittet för att lagra unika element.

  • Set låter dig bara lägga till ett nollelement.

  • Set är inte en lista och stöder inte index eller positioner för dess element.

Kommentarer
  • Populär
  • Ny
  • Gammal
Du måste vara inloggad för att lämna en kommentar
Den här sidan har inga kommentarer än