CodeGym /وبلاگ جاوا /Random-FA /مجموعه جاوا
John Squirrels
مرحله
San Francisco

مجموعه جاوا

در گروه منتشر شد
Set یک رابط در مجموعه Java Framework است. شما می توانید از Java Set برای پیاده سازی مجموعه های نامرتب با عناصر منحصر به فرد استفاده کنید. در این مقاله قصد داریم به بررسی این رابط و پیاده سازی های آن در زبان جاوا، روش های کار با یک مجموعه و همچنین ارائه چند مثال بپردازیم.

جاوا ست چیست؟

Set یک رابط از Java Collection Framework است، اما Set برخلاف List یک مجموعه مرتب نیست . این بدان معناست که عناصر Java Set بدون ترتیب خاصی نگهداری می شوند. بنابراین هیچ کنترلی روی موقعیتی که می توانید یک عنصر را وارد کنید وجود ندارد. همچنین شما نمی توانید به عناصر با فهرست آنها دسترسی پیدا کنید. از نظر ریاضی، یک مجموعه مجموعه ای از عناصر منحصر به فرد است. در واقع، این یک مجموعه نامرتب (مجموعه نامرتب) است که عناصر یکسان را نمی توان در آن ذخیره کرد. اگر عمداً یک عنصر تکراری به یک مجموعه اضافه کنید ، این عمل نادیده گرفته می شود و مجموعه تغییر نمی کند. با این حال، ذخیره یک عنصر تهی در آن مجاز است.

پیاده سازی ها را تنظیم کنید

Java Set یک رابط است، بنابراین باید از یکی از پیاده سازی های آن برای ایجاد اشیاء استفاده کنید. اینها HashSet ، TreeSet و LinkedHashSet هستند . در Set s، هر عنصر تنها در یک نمونه ذخیره می شود و پیاده سازی های مختلف Set از ترتیب متفاوتی برای ذخیره عناصر استفاده می کنند. در HashSet ، ترتیب عناصر توسط یک الگوریتم پیچیده تعیین می شود. اگر ترتیب ذخیره سازی برای شما مهم است، از یک کانتینر TreeSet استفاده کنید ، که اشیاء مرتب شده به ترتیب صعودی را به ترتیب مقایسه ذخیره می کند، یا از LinkedHashSet که عناصر را به ترتیب اضافی ذخیره می کند. مجموعه‌ها اغلب برای تست عضویت استفاده می‌شوند تا بتوانید به راحتی بررسی کنید که آیا یک شی متعلق به یک مجموعه مشخص است، بنابراین در عمل یک پیاده‌سازی HashSet که برای جستجوی سریع بهینه‌سازی شده است معمولا انتخاب می‌شود. HashSet مجموعه ای است که از مقادیر هش بازگردانده شده توسط متد ()hashCode برای ذخیره عناصر در داخل استفاده می کند. یعنی در داخل HashSet<E> شی HashMap <E, Object> ذخیره می شود که مقادیر HashSet را به عنوان کلید ذخیره می کند. استفاده از کدهای هش به شما امکان می دهد تا به سرعت عناصر را از یک مجموعه جستجو، اضافه و حذف کنید . LinkedHashSet یک HashSet است که همچنین عناصر را در یک لیست پیوندی ذخیره می کند. یک HashSet معمولی نظم عنصر را حفظ نمی کند. اولا، به طور رسمی به سادگی وجود ندارد، و ثانیا، حتی نظم داخلی می تواند به طور چشمگیری تغییر کند زمانی که فقط یک عنصر اضافه شود. و می‌توانید یک تکرارکننده از LinkedHashSet بگیرید و از آن استفاده کنید تا تمام عناصر را به ترتیب دقیقی که به LinkedHashSet اضافه شده‌اند مرور کنید . نه اغلب، اما گاهی اوقات ممکن است بسیار ضروری باشد. TreeSet مجموعه ای است که عناصر را به صورت درختی با مرتبه ارزش ذخیره می کند. در داخل TreeSet<E> یک TreeMap<E, Object> وجود دارد که تمام این مقادیر را ذخیره می کند. و این TreeMap از درخت باینری متعادل قرمز-سیاه برای ذخیره عناصر استفاده می کند. بنابراین، دارای عملیات add() , remove() , contain() بسیار سریع است.

یک 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 ، 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 Set آورده شده است:
  • افزودن بولی (E e) . اگر عنصر مشخص شده قبلاً وجود نداشته باشد به مجموعه اضافه می کند (عملیات اختیاری).

  • حذف بولی (Object o) . عنصر مشخص شده را در صورت وجود از این مجموعه حذف می کند (عملیات اختیاری).

  • boolean removeAll(Collection c) . تمام عناصر موجود در مجموعه مشخص شده را از این مجموعه حذف می کند (عملیات اختیاری).

  • boolean retainAll (مجموعه c) . فقط عناصر موجود در این مجموعه را که در مجموعه مشخص شده موجود است (عملیات اختیاری) حفظ می کند.

  • void clear() . تمام عناصر را از مجموعه حذف می کند.

  • Iterator iterator() . یک تکرارکننده بر روی عناصر این مجموعه برمی‌گرداند.

  • int size() . برای بدست آوردن تعداد عناصر در مجموعه استفاده می شود.

  • boolean isEmpty() . برای بررسی خالی بودن یا نبودن Set.

  • بولی حاوی (Object o) است . اگر این مجموعه حاوی عنصر مشخص شده باشد، مقدار true را برمی گرداند.

  • Iterator iterator() . یک تکرارکننده بر روی عناصر این مجموعه برمی‌گرداند. عناصر بدون ترتیب خاصی برگردانده می شوند.

  • Object[] toArray() . یک آرایه حاوی تمام عناصر این مجموعه را برمی‌گرداند. اگر این مجموعه تضمینی بدهد که عناصر آن با چه ترتیبی توسط تکرارکننده بازگردانده می شوند، این روش باید عناصر را به همان ترتیب برگرداند.

متدها مشابه روش‌های ArrayList هستند ، با این تفاوت که متد add(Object o) فقط در صورتی به مجموعه اضافه می‌کند که از قبل وجود نداشته باشد. مقدار برگشتی متد اگر شی اضافه شده باشد درست است و در غیر این صورت false است. همچنین برخی از متدهای به ارث رسیده از Collection<> Interface وجود دارد : parallelStream() , removeIf() , stream() و متد forEach() که از java.lang.Iterable Interface به ارث رسیده است.

نمونه عملیات اصلی جاوا مجموعه

در این مثال، یک آرایه از رشته ها ایجاد می کنیم و سپس با استفاده از عملیات Arrays.asList آن را به mySet ارسال می کنیم . سپس چند عنصر دیگر را حذف کرده و چند عنصر دیگر اضافه می کنیم. در این مورد، یکی از عناصر موجود در مجموعه از قبل وجود دارد: اضافه نخواهد شد. ما همچنین عملیات بررسی خالی بودن isEmpty() ، تعیین اندازه set 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، الف، ب] ج

با تکرار کننده مثال بزنید

بیایید یک مجموعه ایجاد کنیم، سپس آن را با استفاده از یک تکرار کننده چاپ کنیم، و سپس تمام اعداد زوج را از آن حذف کنیم، همچنین با استفاده از یک تکرار کننده.
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 استفاده کنید. در این مثال کوتاه مجموعه را مانند نمونه های قبلی با نام دوستان پر می کنیم. با این حال، در یک 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 بخشی از چارچوب مجموعه های جاوا است.

  • کلاس های پیاده سازی شده: AbstractSet ، ConcurrentHashMap.KeySetView ، ConcurrentSkipListSet ، CopyOnWriteArraySet ، EnumSet ، HashSet ، JobStateReasons ، LinkedHashSet ، TreeSet .

  • محبوب‌ترین پیاده‌سازی‌های Set عبارتند از HashSet ، LinkedHashSet و TreeSet .

  • ترتیب عناصر HashSet توسط یک الگوریتم پیچیده تعیین می شود. اگر ترتیب ذخیره سازی برای شما مهم است، از یک کانتینر TreeSet استفاده کنید ، که اشیاء مرتب شده به ترتیب صعودی را به ترتیب مقایسه ذخیره می کند، یا از LinkedHashSet که عناصر را به ترتیب اضافی ذخیره می کند.

  • اغلب از مجموعه ها برای آزمایش عضویت استفاده می شود. یعنی بررسی اینکه آیا یک شی به یک مجموعه معین به معنای ریاضی تعلق دارد یا خیر. بنابراین اغلب از همه پیاده سازی های Set در عمل، HashSet معمولا انتخاب می شود. این پیاده سازی برای جستجوی سریع بهینه شده است.

  • شما نمی توانید عناصر تکراری را به یک مجموعه اضافه کنید، بنابراین می توانید از پیاده سازی های رابط Set برای ذخیره عناصر منحصر به فرد استفاده کنید.

  • Set به شما امکان می دهد فقط یک عنصر null اضافه کنید.

  • Set یک لیست نیست و از شاخص ها یا موقعیت های عناصر آن پشتیبانی نمی کند.

نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION