John Squirrels
Ниво
San Francisco

Java Set

Публикувано в групата
Set е интерфейс в Java Collection Framework. Можете да използвате Java Set , за да реализирате неподредени колекции с уникални елементи. В тази статия ще разгледаме този интерфейс и неговите реализации на езика Java, методите за работа с набор, а също така ще дадем някои примери.

Какво е Java Set

Set е интерфейс от Java Collection Framework, но Set не е подредена колекция, за разлика от List . Това означава, че елементите на Java Set се съхраняват без определен ред. Така че няма контрол върху позицията, в която можете да вмъкнете елемент. Също така не можете да получите достъп до елементи чрез техния индекс. Математически наборът е колекция от уникални елементи. Всъщност това е неподредена колекция (unordered Collection), в която не могат да се съхраняват идентични елементи. Ако умишлено добавите дублиран елемент към набор , това действие ще бъде игнорирано и наборът няма да се промени. Въпреки това е позволено да се съхранява един нулев елемент в него.

Задайте реализации

Java Set е интерфейс, така че трябва да използвате една от неговите реализации, за да създавате обекти. Това са HashSet , TreeSet и LinkedHashSet . В Set s всеки елемент се съхранява само в един екземпляр и различните имплементации на Set използват различен ред за съхраняване на елементи. В HashSet редът на елементите се определя от сложен алгоритъм. Ако редът на съхранение е важен за вас, използвайте контейнер TreeSet , който съхранява обекти, сортирани във възходящ ред в ред за сравнение, or LinkedHashSet, който съхранява елементи в ред на добавяне. Наборите често се използват за тестване на членството, така че можете лесно да проверите дали даден обект принадлежи към даден набор, така че на практика обикновено се избира внедряване на HashSet , което е оптимизирано за бързо търсене. HashSet е колекция, която използва своите хеш стойности, върнати от метода hashCode() , за вътрешно съхраняване на елементи. Тоест, вътре в HashSet<E> се съхранява обектът HashMap<E, Object> , който съхранява стойностите на HashSet като ключове. Използването на хеш codeове ви позволява бързо да търсите, добавяте и премахвате елементи от Set . LinkedHashSet е HashSetкойто също съхранява елементи в свързан списък. Нормалният HashSet не поддържа реда на елементите. Първо, официално той просто не съществува, и второ, дори вътрешният ред може да се промени драматично, когато се добави само един елемент. И можете да получите итератор от LinkedHashSet и да го използвате, за да преминете през всички елементи в точния ред, в който са бor добавени към LinkedHashSet . Не често, но понякога може да е много необходимо. TreeSet е колекция, която съхранява елементи като подредено по стойност дърво. Вътре в TreeSet<E> има TreeMap<E, Object> , който съхранява всички тези стойности. И тази TreeMapизползва червено-черно балансирано двоично дърво за съхраняване на елементи. Поради това има много бързи операции add() , remove() , contains() .

Създайте Set Object

За да създадете Set Object, можете да използвате една от следните форми:

Set<Integer> intSet = new HashSet<>();
Set<String> vSet = new HashSet<>();
Set mySet = new LinkedHashSet();
HashSet<String> myHashset = new HashSet<>();
Ето един прост пример, където създаваме 2 Set s, HashSet и LinkedHashSet и добавяме към всеки по 5 елемента. Можем да използваме метода add() за това.

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);
    }
}
Ето резултата от програмата:
[Алекс, Игор, Стюарт, Джони, Бел] [Стюарт, Алекс, Джони, Игор, Бел]
Както споменахме по-горе, HashSet не поддържа реда на елементите, но LinkedHashSet го прави. LinkedHashSet ни даде елементите в реда, в който ги записахме в набора .

Методи за задаване на Java

Ето някои от важните методи на Java Set :
  • булево добавяне (E e) . Добавя посочения елемент към набора, ако вече не е наличен (незадължителна операция).

  • булево премахване (Object o) . Премахва посочения елемент от този набор, ако е наличен (незадължителна операция).

  • boolean removeAll(Collection c) . Премахва от този набор всички негови елементи, които се съдържат в указаната колекция (незадължителна операция).

  • boolean retainAll(Collection c) . Запазва само елементите в този набор, които се съдържат в указаната колекция (незадължителна операция).

  • void clear() . Премахва всички елементи от комплекта.

  • Итератор iterator() . Връща итератор върху елементите в този набор.

  • int size() . използва се за получаване на броя на елементите в набора.

  • boolean isEmpty() . за да проверите дали Set е празен or не.

  • boolean съдържа (обект o) . Връща true, ако този набор съдържа посочения елемент.

  • Итератор iterator() . Връща итератор върху елементите в този набор. Елементите се връщат без определен ред.

  • Object[] toArray() . Връща масив, съдържащ всички елементи в този набор. Ако този набор дава няHowви гаранции за това в Howъв ред неговите елементи се връщат от неговия итератор, този метод трябва да върне елементите в същия ред.

Методите са подобни на тези на ArrayList , с изключение на това, че методът add(Object o) добавя обект към набора само ако той вече не е там. Върнатата стойност на метода е true, ако обектът е добавен, и false в противен случай. Има и някои методи, наследени от Collection<> Interface: parallelStream() , removeIf() , stream() и forEach() метод, наследен от java.lang.Iterable Interface.

Пример за основните операции на Java Set

В този пример създаваме масив от низове и след това го предаваме на mySet с помощта на операцията Arrays.asList . След това премахваме още няколко елемента и добавяме още няколко. В този случай един от елементите в набора вече съществува: той няма да бъде добавен. Ще опитаме и операциите за проверка за празнота isEmpty() , определяне на размера на набора size() и изчистване на набора от всички елементи 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());

   }
}
Резултатът от програмата е тук:
[Алекс, Игор, Стюарт, Таня, Джони, Айви] [Алекс, Таня, Джони, Айви] [Алекс, Даша, Таня, Джони, Айви] Количеството елементи на комплекта = 5 MySet празен ли е? false Игор в сет ли е? false Джони в комплект ли е? true mySet празен ли е сега? вярно

Пример с LinkedHashSet и зададен на Array

Нека напишем друга програма. В него ще създадем набор, базиран на LinkedHashSet , ще добавим елементи към него и след това ще преобразуваме набора в масив.

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

       }
   }
Ето резултата от програмата:
[C, D, E, F, G, A, B] false Отпечатайте нашия набор с премахнати елементи: [C, D, E, G, A, B] Нов масив от набор: [C, D, E, G, A, B] C

Задайте пример с итератор

Нека създадем набор, след това да го отпечатаме с помощта на итератор и след това да премахнем всички четни числа от него, също с помощта на итератор.

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

       }
}
Резултатът от програмата е тук:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 3, 5, 7, 9

Пример с TreeSet

Ако сортирането е важно за вас, използвайте имплементацията на TreeSet . В този кратък пример ще попълним множеството с имена на приятели, Howто в предишните примери. Въпреки това, в сортиран TreeSet , елементите веднага ще бъдат записани в сортиран ред. В този случай имената ще бъдат показани по азбучен ред.

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

   }
Резултатът е:
[Алекс, Бел, Игор, Джони, Стюарт]

Кратки изводи

  • Интерфейсът Java Set е част от Java Collections Framework.

  • Внедрени класове: AbstractSet , ConcurrentHashMap.KeySetView , ConcurrentSkipListSet , CopyOnWriteArraySet , EnumSet , HashSet , JobStateReasons , LinkedHashSet , TreeSet .

  • Най-популярните реализации на Set са HashSet , LinkedHashSet и TreeSet .

  • Редът на елементите на HashSet се определя от сложен алгоритъм. Ако редът на съхранение е важен за вас, използвайте контейнер TreeSet , който съхранява обекти, сортирани във възходящ ред в ред за сравнение, or LinkedHashSet , който съхранява елементи в ред на добавяне.

  • Най-често комплектите се използват за тестване на членство. Тоест да се провери дали даден обект принадлежи към дадено множество в математически смисъл. Така че най-често от всички реализации на Set на практика обикновено се избира HashSet . Това изпълнение е оптимизирано за бързо търсене.

  • Не можете да добавяте дублиращи се елементи към набор, така че можете да използвате реализации на интерфейса Set за съхраняване на уникални елементи.

  • Set ви позволява да добавите само един нулев елемент.

  • Наборът не е списък и не поддържа индекси or позиции на своите елементи.

Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION