جاوا ست چیست؟
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);
}
}
این هم خروجی برنامه:
روش های مجموعه جاوا
در اینجا برخی از روش های مهم 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() . یک آرایه حاوی تمام عناصر این مجموعه را برمیگرداند. اگر این مجموعه تضمینی بدهد که عناصر آن با چه ترتیبی توسط تکرارکننده بازگردانده می شوند، این روش باید عناصر را به همان ترتیب برگرداند.
نمونه عملیات اصلی جاوا مجموعه
در این مثال، یک آرایه از رشته ها ایجاد می کنیم و سپس با استفاده از عملیات 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());
}
}
خروجی برنامه اینجاست:
با 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]);
}
}
این هم خروجی برنامه:
با تکرار کننده مثال بزنید
بیایید یک مجموعه ایجاد کنیم، سپس آن را با استفاده از یک تکرار کننده چاپ کنیم، و سپس تمام اعداد زوج را از آن حذف کنیم، همچنین با استفاده از یک تکرار کننده.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);
}
}
خروجی برنامه اینجاست:
مثال با 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 یک لیست نیست و از شاخص ها یا موقعیت های عناصر آن پشتیبانی نمی کند.
GO TO FULL VERSION