John Squirrels
Szint
San Francisco

Java készlet

Megjelent a csoportban
A Set egy felület a Java Collection Frameworkben. A Java Set segítségével egyedi elemeket tartalmazó rendezetlen gyűjteményeket valósíthat meg. Ebben a cikkben megvizsgáljuk ezt a felületet és annak Java nyelvű implementációit, a halmazokkal való munkamódszereket, és néhány példát is adunk.

Mi az a Java Set

A Set a Java Collection Framework felülete, de a Set nem egy rendezett gyűjtemény, ellentétben a Listával . Ez azt jelenti, hogy a Java Set elemeket külön sorrend nélkül tartják meg. Így nincs befolyása az elem beszúrásának helyére. Az elemekhez az indexük alapján sem lehet hozzáférni. Matematikailag a halmaz egyedi elemek gyűjteménye. Valójában ez egy rendezetlen gyűjtemény (rendezetlen gyűjtemény), amelyben nem tárolhatók azonos elemek. Ha szándékosan ismétlődő elemet ad hozzá egy halmazhoz , akkor ezt a műveletet a rendszer figyelmen kívül hagyja, és a készlet nem változik. Megengedett azonban egy null elem tárolása benne.

Megvalósítások beállítása

A Java Set egy interfész, ezért annak valamelyik megvalósítását kell használnia objektumok létrehozásához. Ezek a HashSet , a TreeSet és a LinkedHashSet . A Set s- ben minden elem csak egy példányban kerül tárolásra, és a Set különböző megvalósításai eltérő sorrendet használnak az elemek tárolására. A HashSetben az elemek sorrendjét egy összetett algoritmus határozza meg. Ha a tárolási sorrend fontos az Ön számára, használjon TreeSet tárolót, amely az objektumokat összehasonlítási sorrendben növekvő sorrendben tárolja, vagy egy LinkedHashSet-et ., amely az elemeket kiegészítő sorrendben tárolja. A készleteket gyakran használják a tagság tesztelésére, így könnyen ellenőrizhető, hogy egy objektum egy adott halmazhoz tartozik-e, ezért a gyakorlatban általában a gyors keresésre optimalizált HashSet implementációt választják. A HashSet egy olyan gyűjtemény, amely a hashCode() metódus által visszaadott hash értékeit használja az elemek belső tárolására. Vagyis a HashSet<E> belsejében a HashMap<E, Object> objektum tárolódik, amely kulcsként tárolja a HashSet értékeit. A hash kódok segítségével gyorsan kereshet, elemeket adhat hozzá és eltávolíthat egy készletből . A LinkedHashSet egy HashSetamely szintén egy linkelt listában tárolja az elemeket. A normál HashSet nem tartja fenn az elemek sorrendjét. Először is, hivatalosan egyszerűen nem létezik, másodszor pedig még a belső rend is drámaian megváltozhat, ha csak egy elemet adunk hozzá. És beszerezhet egy iterátort a LinkedHashSet- ből , és ezzel az összes elemet pontosan abban a sorrendben megy végig, ahogyan azokat hozzáadta a LinkedHashSethez . Nem gyakran, de néha nagyon szükséges lehet. A TreeSet egy olyan gyűjtemény, amely értékrendezett faként tárolja az elemeket. A TreeSet<E> belsejében található egy TreeMap<E, Object> , amely ezeket az értékeket tárolja. És ez a TreeMappiros-fekete kiegyensúlyozott bináris fát használ az elemek tárolására. Ezért nagyon gyors add() , remove() , include() műveletekkel rendelkezik .

Hozzon létre egy objektumkészletet

Objektumkészlet létrehozásához használhatja a következő űrlapok egyikét:
Set<Integer> intSet = new HashSet<>();
Set<String> vSet = new HashSet<>();
Set mySet = new LinkedHashSet();
HashSet<String> myHashset = new HashSet<>();
Íme egy egyszerű példa, ahol létrehozunk 2 Set- et, HashSet-et és LinkedHashSet-et , és mindegyikbe hozzáadunk 5 elemet. Ehhez használhatjuk az add() metódust.
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);
    }
}
Íme a program kimenete:
[Alex, Igor, Stuart, Johnny, Bel] [Stuart, Alex, Johnny, Igor, Bel]
Ahogy fentebb említettük, a HashSet nem tartja fenn az elemek sorrendjét, a LinkedHashSet viszont igen. A LinkedHashSet adta meg nekünk az elemeket abban a sorrendben, ahogyan a halmazba írtuk.

Java Set Methods

Íme néhány fontos Java Set metódus:
  • logikai add(E e) . Hozzáadja a megadott elemet a készlethez, ha még nincs jelen (opcionális művelet).

  • logikai eltávolítás(Object o) . Eltávolítja a megadott elemet ebből a halmazból, ha jelen van (opcionális művelet).

  • boolean removeAll(c gyűjtemény) . Eltávolítja a halmaz összes elemét, amely a megadott gyűjteményben található (opcionális művelet).

  • logikai retenAll(c gyűjtemény) . Csak azokat az elemeket tartja meg ebben a halmazban, amelyek a megadott gyűjteményben találhatók (opcionális művelet).

  • void clear() . Eltávolítja az összes elemet a készletből.

  • Iterátor iterátor() . Egy iterátort ad vissza a halmaz elemei felett.

  • int size() . a Halmaz elemeinek számának lekérésére szolgál.

  • logikai érték isEmpty() . ellenőrizni, hogy a Set üres-e vagy sem.

  • logikai érték tartalmazza (o Object) . Igaz értéket ad vissza, ha ez a halmaz tartalmazza a megadott elemet.

  • Iterátor iterátor() . Egy iterátort ad vissza a halmaz elemei felett. Az elemek nem meghatározott sorrendben kerülnek visszaküldésre.

  • Object[] toArray() . Egy tömböt ad vissza, amely a halmaz összes elemét tartalmazza. Ha ez a halmaz garantálja, hogy az iterátor milyen sorrendben adja vissza elemeit, akkor ennek a metódusnak ugyanabban a sorrendben kell visszaadnia az elemeket.

A metódusok hasonlóak az ArrayList metódusaihoz , azzal a különbséggel, hogy az add(Object o) metódus csak akkor ad hozzá egy objektumot a halmazhoz, ha az még nincs ott. A metódus visszatérési értéke igaz, ha az objektumot hozzáadta, és false egyébként. Vannak még a Collection<> Interface-ből örökölt metódusok: parallelStream() , removeIf() , stream() és forEach() metódus a java.lang.Iterable Interface-ből örökölt.

Java Set fő műveleti példa

Ebben a példában létrehozunk egy karakterlánc-tömböt, majd az Arrays.asList művelettel átadjuk a mySet- nek . Ezután eltávolítunk néhány további elemet, és hozzáadunk még néhányat. Ebben az esetben a készlet egyik eleme már létezik: nem lesz hozzáadva. Megpróbáljuk továbbá az üresség ellenőrzését isEmpty() , a size() halmaz méretének meghatározását és a clear() összes elem halmaz törlését .
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());

   }
}
A program kimenete itt található:
[Alex, Igor, Stuart, Tanya, Johnny, Ivy] [Alex, Tanya, Johnny, Ivy] [Alex, Dasha, Tanya, Johnny, Ivy] A készlet elemeinek mennyisége = 5 A mySet üres? false Igor a készletben van? false Johnny a készletben van? true A mySet most üres? igaz

Példa LinkedHashSet-tel, és állítsa az Array-re

Írjunk egy másik programot. Ebben létrehozunk egy halmazt a LinkedHashSet alapján , elemeket adunk hozzá, majd a készletet tömbbé alakítjuk.
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]);

       }
   }
Íme a program kimenete:
[C, D, E, F, G, A, B] false Nyomtassa ki készletünket eltávolított elemekkel: [C, D, E, G, A, B] Új tömb a készletből: [C, D, E, G, A, B] C

Mutasson példát az iterátorral

Hozzunk létre egy halmazt, majd iterátor segítségével nyomtassuk ki, majd távolítsunk el belőle minden páros számot, szintén iterátor segítségével.
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);

       }
}
A program kimenete itt található:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 3, 5, 7, 9

Példa a TreeSettel

Ha a rendezés fontos Önnek, használja a TreeSet implementációt. Ebben a rövid példában az előző példákhoz hasonlóan a barátok nevével fogjuk kitölteni a halmazt. A rendezett TreeSetben azonban az elemek azonnal rendezett sorrendbe kerülnek. Ebben az esetben a nevek ábécé sorrendben jelennek meg.
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);

   }
A kimenet a következő:
[Alex, Bel, Igor, Johnny, Stuart]

Rövid következtetések

  • A Java Set felület a Java Collections Framework része.

  • Megvalósított osztályok: AbstractSet , ConcurrentHashMap.KeySetView , ConcurrentSkipListSet , CopyOnWriteArraySet , EnumSet , HashSet , JobStateReasons , LinkedHashSet , TreeSet .

  • A legnépszerűbb készletmegvalósítások a HashSet , a LinkedHashSet és a TreeSet .

  • A HashSet elemek sorrendjét egy összetett algoritmus határozza meg. Ha fontos a tárolási sorrend, használjon TreeSet tárolót, amely az objektumokat növekvő sorrendben, összehasonlítási sorrendben tárolja, vagy egy LinkedHashSetet , amely az elemeket összeadási sorrendben tárolja.

  • Leggyakrabban készleteket használnak a tagság tesztelésére. Vagyis annak ellenőrzésére, hogy egy objektum matematikai értelemben egy adott halmazhoz tartozik-e. Tehát a gyakorlatban a Set- megvalósítások közül leggyakrabban a HashSet-et választják. Ez a megvalósítás a gyors keresésre van optimalizálva.

  • Egy halmazhoz nem adható duplikált elemek, ezért a Set felület implementációit használhatja egyedi elemek tárolására.

  • A Set lehetővé teszi, hogy csak egy null elemet adjon hozzá.

  • A készlet nem lista, és nem támogatja az indexeket vagy az elemek pozícióit.

Hozzászólások
  • Népszerű
  • Új
  • Régi
Hozzászólás írásához be kell jelentkeznie
Ennek az oldalnak még nincsenek megjegyzései