सेट जावा कलेक्शन फ्रेमवर्क में एक इंटरफ़ेस है। आप अद्वितीय तत्वों के साथ अनियंत्रित संग्रहों को लागू करने के लिए जावा सेट का उपयोग कर सकते हैं। इस लेख में, हम इस इंटरफ़ेस और जावा भाषा में इसके कार्यान्वयन, एक सेट के साथ काम करने के तरीके और कुछ उदाहरण भी देखेंगे।

जावा सेट क्या है

सेट जावा संग्रह फ्रेमवर्क से एक इंटरफ़ेस है, लेकिन सूची के विपरीत सेट एक आदेशित संग्रह नहीं है । इसका मतलब है कि जावा सेट तत्वों को बिना किसी विशेष क्रम के रखा जाता है। इसलिए उस स्थिति पर कोई नियंत्रण नहीं है जहाँ आप एक तत्व सम्मिलित कर सकते हैं। साथ ही आप तत्वों को उनके अनुक्रमणिका द्वारा एक्सेस नहीं कर सकते हैं। गणितीय रूप से, एक सेट अद्वितीय तत्वों का एक संग्रह है। वास्तव में, यह एक अनियंत्रित संग्रह (अनऑर्डर्ड कलेक्शन) है, जिसमें समान तत्वों को संग्रहीत नहीं किया जा सकता है। यदि आप जानबूझकर सेट में डुप्लिकेट तत्व जोड़ते हैं , तो इस क्रिया को अनदेखा कर दिया जाएगा और सेट नहीं बदलेगा। हालाँकि इसमें एक अशक्त तत्व को संग्रहीत करने की अनुमति है।

कार्यान्वयन सेट करें

जावा सेट एक इंटरफ़ेस है, इसलिए आपको ऑब्जेक्ट बनाने के लिए इसके कार्यान्वयन में से एक का उपयोग करने की आवश्यकता है। ये हैशसेट , ट्रीसेट और लिंक्ड हैशसेट हैं । सेट एस में , प्रत्येक तत्व को केवल एक उदाहरण में संग्रहीत किया जाता है, और सेट के विभिन्न कार्यान्वयन तत्वों को संग्रहीत करने के लिए एक अलग क्रम का उपयोग करते हैं। हैशसेट में , तत्वों का क्रम एक जटिल एल्गोरिथम द्वारा निर्धारित किया जाता है। यदि भंडारण क्रम आपके लिए महत्वपूर्ण है, तो एक ट्रीसेट कंटेनर का उपयोग करें, जो तुलनात्मक क्रम में आरोही क्रम में क्रमबद्ध वस्तुओं को संग्रहीत करता है, या एक लिंक्ड हैशसेट, जो अतिरिक्त क्रम में तत्वों को संग्रहीत करता है। सदस्यता परीक्षण के लिए अक्सर सेट का उपयोग किया जाता है ताकि आप आसानी से जांच सकें कि कोई ऑब्जेक्ट किसी दिए गए सेट से संबंधित है या नहीं, इसलिए अभ्यास में तेजी से देखने के लिए अनुकूलित हैशसेट कार्यान्वयन आमतौर पर चुना जाता है। हैशसेट एक संग्रह है जो तत्वों को आंतरिक रूप से संग्रहीत करने के लिए हैशकोड () विधि द्वारा लौटाए गए उनके हैश मान का उपयोग करता है । अर्थात्, हैशसेट <E> के अंदर , हैश मैप <ई, ऑब्जेक्ट> ऑब्जेक्ट संग्रहीत किया जाता है, जो हैशसेट के मानों को कुंजी के रूप में संग्रहीत करता है। हैश कोड का उपयोग करने से आप सेट से तत्वों को त्वरित रूप से खोज, जोड़ और निकाल सकते हैं । लिंक्ड हैशसेट एक हैशसेट हैजो लिंक की गई सूची में तत्वों को भी संग्रहीत करता है। एक सामान्य हैशसेट तत्व क्रम को बनाए नहीं रखता है। सबसे पहले, यह आधिकारिक तौर पर मौजूद नहीं है, और दूसरी बात, यहां तक ​​​​कि केवल एक तत्व जोड़े जाने पर भी आंतरिक क्रम नाटकीय रूप से बदल सकता है। और आप LinkedHashSet से एक पुनरावर्तक प्राप्त कर सकते हैं और इसका उपयोग सभी तत्वों को सटीक क्रम में करने के लिए कर सकते हैं जिसमें उन्हें LinkedHashSet में जोड़ा गया था । अक्सर नहीं, लेकिन कभी-कभी यह बहुत जरूरी हो सकता है। एक ट्रीसेट एक संग्रह है जो तत्वों को मूल्य-क्रम वाले पेड़ के रूप में संग्रहीत करता है। TreeSet<E> के अंदर एक TreeMap<E, Object> है जो इन सभी मानों को संग्रहीत करता है। और यह ट्रीमैपतत्वों को संग्रहीत करने के लिए लाल-काले संतुलित बाइनरी ट्री का उपयोग करता है। इसलिए, इसमें बहुत तेज़ ऐड () , रिमूव () , सम्‍मिलित () ऑपरेशंस हैं।

एक सेट ऑब्जेक्ट बनाएँ

एक सेट ऑब्जेक्ट बनाने के लिए आप अगले फॉर्म में से एक का उपयोग कर सकते हैं:

Set<Integer> intSet = new HashSet<>();
Set<String> vSet = new HashSet<>();
Set mySet = new LinkedHashSet();
HashSet<String> myHashset = new HashSet<>();
यहां एक सरल उदाहरण है, जहां हम 2 सेट एस, हैशसेट और लिंक्ड हैशसेट बनाते हैं , और प्रत्येक में 5 तत्वों को जोड़ते हैं। हम इसके लिए ऐड () विधि का उपयोग कर सकते हैं।

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);
    }
}
यहाँ कार्यक्रम का आउटपुट है:
[एलेक्स, इगोर, स्टुअर्ट, जॉनी, बेल] [स्टुअर्ट, एलेक्स, जॉनी, इगोर, बेल]
जैसा कि हमने ऊपर उल्लेख किया है, हैशसेट तत्वों के क्रम को बनाए नहीं रखता है, लेकिन लिंक्ड हैशसेट करता है। यह LinkedHashSet था जिसने हमें तत्वों को उस क्रम में दिया जिस क्रम में हमने उन्हें सेट पर लिखा था।

जावा सेट तरीके

यहाँ जावा सेट के कुछ महत्वपूर्ण तरीके दिए गए हैं:
  • बूलियन ऐड (ई ई) . निर्दिष्ट तत्व को सेट में जोड़ता है यदि यह पहले से मौजूद नहीं है (वैकल्पिक ऑपरेशन)।

  • बूलियन रिमूव (ऑब्जेक्ट ओ) । यदि यह मौजूद है (वैकल्पिक ऑपरेशन) इस सेट से निर्दिष्ट तत्व को हटा देता है।

  • बूलियन निकालें सभी (संग्रह सी) । निर्दिष्ट संग्रह (वैकल्पिक संचालन) में निहित इसके सभी तत्वों को इस सेट से हटा देता है।

  • बूलियन रिटेनएल (संग्रह सी) । इस सेट में केवल उन तत्वों को बनाए रखता है जो निर्दिष्ट संग्रह (वैकल्पिक संचालन) में निहित हैं।

  • शून्य स्पष्ट () । सेट से सभी तत्वों को हटा देता है।

  • इटरेटर इटरेटर () । इस सेट में तत्वों पर एक पुनरावर्तक लौटाता है।

  • इंट आकार () । इसका उपयोग सेट में तत्वों की संख्या प्राप्त करने के लिए किया जाता है।

  • बूलियन खाली है () । यह जांचने के लिए कि सेट खाली है या नहीं।

  • बूलियन में शामिल है (ऑब्जेक्ट ओ) । यदि इस सेट में निर्दिष्ट तत्व शामिल है तो सत्य वापस आ जाता है।

  • इटरेटर इटरेटर () । इस सेट में तत्वों पर एक पुनरावर्तक लौटाता है। तत्वों को किसी विशेष क्रम में वापस नहीं किया जाता है।

  • ऑब्जेक्ट [] toArray() । इस सेट में सभी तत्वों वाली एक सरणी देता है। यदि यह सेट इस बात की कोई गारंटी देता है कि इसके इटरेटर द्वारा इसके तत्वों को किस क्रम में वापस किया जाता है, तो इस विधि को उसी क्रम में तत्वों को वापस करना होगा।

विधियाँ ArrayList के समान हैं , सिवाय इसके कि ऐड (ऑब्जेक्ट o) विधि सेट में केवल एक वस्तु जोड़ती है यदि यह पहले से मौजूद नहीं है। विधि का वापसी मान सत्य है यदि वस्तु को जोड़ा गया है, और अन्यथा गलत है। Collection<> इंटरफ़ेस से विरासत में मिली कुछ विधियाँ भी हैं : ParallelStream() , removeIf() , stream() और forEach() विधि java.lang.Iterable इंटरफ़ेस से विरासत में मिली है।

जावा सेट मुख्य संचालन उदाहरण

इस उदाहरण में, हम स्ट्रिंग्स की एक सरणी बनाते हैं और फिर इसे Arrays.asList ऑपरेशन का उपयोग करके mySet में पास करते हैं। फिर हम कुछ और तत्वों को हटाते हैं, और कुछ और जोड़ते हैं। इस मामले में, सेट में तत्वों में से एक पहले से मौजूद है: इसे जोड़ा नहीं जाएगा। हम खालीपन isEmpty() के लिए जाँच के संचालन का भी प्रयास करेंगे , सेट आकार के आकार का निर्धारण () और सभी तत्वों के सेट को साफ़ करें ()

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 अब खाली है? सत्य

LinkedHashSet के साथ उदाहरण और ऐरे पर सेट करें

चलिए एक और प्रोग्राम लिखते हैं। इसमें, हम 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]);

       }
   }
यहाँ कार्यक्रम का आउटपुट है:
[सी, डी, ई, एफ, जी, ए, बी] हटाए गए तत्वों के साथ हमारे सेट को गलत प्रिंट करें: [सी, डी, ई, जी, ए, बी] सेट से नई सरणी: [सी, डी, ई, जी, ए, बी] सी

इटरेटर के साथ उदाहरण सेट करें

चलिए एक सेट बनाते हैं, फिर एक इटरेटर का उपयोग करके इसे प्रिंट करते हैं, और फिर इसमें से सभी सम संख्याओं को हटाते हैं, वह भी एक इटरेटर का उपयोग करके।

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

ट्रीसेट के साथ उदाहरण

यदि छँटाई आपके लिए महत्वपूर्ण है, तो ट्रीसेट कार्यान्वयन का उपयोग करें। इस छोटे से उदाहरण में, हम सेट में दोस्तों के नाम भरेंगे, जैसा कि पिछले उदाहरणों में है। हालाँकि, सॉर्ट किए गए ट्रीसेट में , तत्वों को तुरंत सॉर्ट किए गए क्रम में लिखा जाएगा। इस स्थिति में, नाम वर्णानुक्रम में प्रदर्शित किए जाएंगे।

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

   }
आउटपुट है:
[एलेक्स, बेल, इगोर, जॉनी, स्टुअर्ट]

संक्षिप्त निष्कर्ष

  • जावा सेट इंटरफ़ेस जावा कलेक्शंस फ्रेमवर्क का हिस्सा है।

  • कार्यान्वित वर्ग: सारसेट , समवर्ती हैश मैप.कीसेट व्यू , समवर्ती स्किप लिस्टसेट , कॉपीऑनराइटएरेसेट , एनमसेट , हैशसेट , जॉबस्टेट रीज़न , लिंक्ड हैशसेट , ट्रीसेट

  • सबसे लोकप्रिय सेट कार्यान्वयन हैशसेट , लिंक्ड हैशसेट और ट्रीसेट हैं ।

  • हैशसेट तत्व क्रम एक जटिल एल्गोरिथम द्वारा निर्धारित किया जाता है। यदि भंडारण क्रम आपके लिए महत्वपूर्ण है, तो ट्रीसेट कंटेनर का उपयोग करें, जो तुलनात्मक क्रम में आरोही क्रम में क्रमबद्ध वस्तुओं को संग्रहीत करता है, या एक लिंक्ड हैशसेट , जो अतिरिक्त क्रम में तत्वों को संग्रहीत करता है।

  • अक्सर, सदस्यता का परीक्षण करने के लिए सेट का उपयोग किया जाता है। अर्थात्, यह जाँचने के लिए कि क्या कोई वस्तु गणितीय अर्थ में दिए गए सेट से संबंधित है। तो व्यवहार में सभी सेट कार्यान्वयनों में से अधिकांश में , आमतौर पर हैशसेट को चुना जाता है। यह क्रियान्वयन तेजी से खोज के लिए अनुकूलित है।

  • आप एक सेट में डुप्लिकेट तत्व नहीं जोड़ सकते हैं, इसलिए आप अद्वितीय तत्वों को स्टोर करने के लिए सेट इंटरफ़ेस के कार्यान्वयन का उपयोग कर सकते हैं।

  • सेट आपको केवल एक अशक्त तत्व जोड़ने की अनुमति देता है।

  • सेट एक सूची नहीं है और इसके तत्वों की अनुक्रमणिका या स्थिति का समर्थन नहीं करता है।