קבוצת Java – קבוצה ב-Java

סט ג'אווה הוא אוסף של איברים (או אובייקטים) שאינו מכיל איברים כפולים. סט ג'אווה הוא ממשק שמורחב מהממשק Collection. לעומת רשימה, סט ג'אווה אינו אוסף ממוין, ויש לו סדר ספציפי לאיברים. סט ג'אווה אינו מספק שליטה על המיקום שבו ניתן להוסיף איבר. אין אפשרות לגשת לאיברים לפי המיקום שלהם וגם לחפש איברים ברשימה.

סט ג'אווה

במקטע זה, נדון בנקודות החשובות על סט ג'אווה:

  • ממשק סט ג'אווה הוא חלק ממסגרת האוסף של ג'אווה.
  • לעומת רשימה, סט אינו מאפשר להוסיף איברים כפולים.
  • סט מאפשר להוסיף לכל היותר איבר null אחד בלבד.
  • בממשק סט יש שיטה בררת מחדל אחת בג'אווה 8: spliterator.
  • לעומת רשימה ומערכים, סט אינו תומך באינדקסים או מיקומים של האיברים שלו.
  • סט תומך בגנריקס וכדאי להשתמש בו כל עוד ניתן. שימוש בגנריקס עם סט ימנע מטעויות סוג בזמן ריצה.
  • ניתן להשתמש במימושים של ממשק סט כדי לשמור על איברים ייחודיים.

תרשים דיאגרמה של מחלקת Set ב-Java

ממשק Set ב-Java מרחיב את ממשק Collection. ממשק Collection מרחיב את ממשק Iterable. כמה ממימושי Set הנפוצים הם HashSet, LinkedHashSet, TreeSet, CopyOnWriteArraySet ו-ConcurrentSkipListSet. AbstractSet מספק יישום מסגרת של ממשק ה-Set כדי להפחית את המאמץ ביישום של Set.

שיטות Set ב-Java

במקטע זה נדבר על כמה מהשיטות השימושיות ביותר של Set ב-Java:

  1. int size(): לקבלת מספר האיברים ב-Set.
  2. boolean isEmpty(): לבדיקה אם ה-Set ריק או לא.
  3. boolean contains(Object o): מחזיר true אם ה-Set מכיל את האיבר הספציפי.
  4. Iterator iterator(): מחזיר איטרטור על איברי ה-Set. האיברים מוחזרים בסדר אקראי.
  5. Object[] toArray(): מחזיר מערך המכיל את כל האיברים ב-Set. אם ה-Set עושה כל התחייבות לסדר בו האיברים מוחזרים על ידי האיטרטור שלו, אזי שיטה זו חייבת להחזיר את האיברים באותו סדר.
  6. boolean add(E e): מוסיף את האיבר המצויין לסט זה אם הוא עדיין לא קיים (פעולה אופציונלית).
  7. boolean remove(Object o): מסיר את האיבר המצויין מהסט הזה אם הוא קיים (פעולה אופציונלית).
  8. boolean removeAll(Collection c): מסיר מהסט הזה את כל האיברים שלו שנמצאים באוסף המצויין (פעולה אופציונלית).
  9. boolean retainAll(Collection c): משמר רק את האיברים בסט הזה שנמצאים באוסף המצויין (פעולה אופציונלית).
  10. void clear(): מסיר את כל האיברים מהסט.
  11. Iterator iterator(): מחזיר איטרטור על האיברים בסט הזה.

מערך Java לסט

בניגוד לרשימה, אין אפשרות להמיר Set של Java למערך ישירות מאחר והוא לא מיושם באמצעות מערך. לכן, אין אפשרות להשתמש במחלקת Arrays כדי לקבל את התצוגה של המערך כסט. נוכל לעקוב אחרי גישה נוספת. נוכל להמיר מערך לרשימה באמצעות כלי Arrays.asList(), ולאחר מכן להשתמש בו כדי ליצור Set. על ידי שימוש בגישה זו, נוכל להמיר מערך Java לסט בשני דרכים. נדון בהן אחת ליד אחת באמצעות דוגמה פשוטה. גישה 1 בגישה זו, תחילה נצטרך ליצור רשימה באמצעות המערך הנתון ולהשתמש בה כדי ליצור סט כפי שמוצג למטה.

import java.util.*;

public class ArrayToSet {
   public static void main(String[] args) {
		
	String[] vowels = {"a","e","i","o","u"};
		
	Set<String> vowelsSet = new HashSet>(Arrays.asList(vowels));
	System.out.println(vowelsSet);
	
	/**
	 * Unlike List, Set is NOt backed by array, 
	 * so we can do structural modification without any issues.
	 */
	vowelsSet.remove("e");
	System.out.println(vowelsSet);
	vowelsSet.clear();
	System.out.println(vowelsSet);
   }
}

גישה-2 בגישה זו, אנו אינו משתמשים ברשימה אמצעית כדי ליצור קבוצה ממערך. תחילה ניצור אוסף ריק, ולאחר מכן נשתמש ב- Collections.addAll() כדי להעתיק את האלמנטים של המערך לתוך הקבוצה שניתן ככה שמוצג למטה.

import java.util.*;

public class ArrayToSet2 {
   public static void main(String[] args) {
		
	String[] vowels = {"a","e","i","o","u"};
		
	Set<String> vowelsSet = new HashSet<>();
	Collections.addAll(vowelsSet, vowels); 
	System.out.println(vowelsSet);

	/** 
	 * Unlike List, Set is NOt backed by array, 
	 * so we can do structural modification without any issues.
	 */
	vowelsSet.remove("e");
	System.out.println(vowelsSet);
	vowelsSet.clear();
	System.out.println(vowelsSet);
   }
}

פלט:- כאשר אנו מפעילים שני התוכניות למעלה, נקבל את אותו פלט המוצג למטה.

[a, e, u, i, o]
[a, u, i, o]
[]

המרת Set למערך ב-Java

בסעיף זה, נכתוב תוכנית להמרת סט של מחרוזות למערך של מחרוזות באמצעות שיטת Set.toArray() כפי שמוצג למטה.

import java.util.*;

public class SetToArray {
   public static void main(String[] args) {
	Set();

	// הוספת דוגמה
	vowelsSet.add("a");
	vowelsSet.add("e");
	vowelsSet.add("i");
	vowelsSet.add("o");
	vowelsSet.add("u");
		
	// המרת Set למערך
	String strArray[] = vowelsSet.toArray(new String[vowelsSet.size()]);
	System.out.println(Arrays.toString(strArray)); 
   }
}

פלט:- כאשר אנו מפעילים את התוכנית למעלה, נקבל את הפלט הבא המוצג למטה.

[a, e, u, i, o]

מיון Set ב-Java

כפי שאנו יודעים, סט (HashSet) אינו תומך במיון אלמנטים ישירות. הוא אוחסן ומציג את האלמנטים שלו בסדר אקראי. אף על פי שכן, יש לנו כמה גישות למיון האלמנטים שלו כפי שמוצג למטה:

import java.util.*;

public class SetSortingExample {

	public static void main(String[] args) {
		Set<Integer> intsSet = new HashSet<>();
		Random random = new Random();
		for (int i = 0; i  {return (o2-o1);});
		System.out.println("Reverse Sorting: " + intsList2);

		// Approach-3
		Set<Integer> sortedSet = new TreeSet<>(intsSet);
		System.out.println("Sorted Set: " + sortedSet);
	}
}

פלט:- כאשר אנו מפעילים את התוכנית למעלה, נראה את הפלט הבא.

[560, 864, 176, 657, 135, 103, 40, 123, 555, 589]
Natural Sorting: [40, 103, 123, 135, 176, 555, 560, 589, 657, 864]
Before Sorting: [560, 864, 176, 657, 135, 103, 40, 123, 555, 589]
Reverse Sorting: [864, 657, 589, 560, 555, 176, 135, 123, 103, 40]
Sorted Set: [40, 103, 123, 135, 176, 555, 560, 589, 657, 864]

פעולות נפוצות במבני נתונים Set ב-Java

הפעולות הנפוצות ביותר שמבוצעות על מבני נתונים Set ב-Java הן הוספה, הוספת הכל, ניקוי, גודל וכו '. להלן דוגמה פשוטה של מבנה נתונים Set ב-Java המראה שימוש נפוץ בשיטות.

import java.util.*;

public class SetCommonOperations 
{
   public static void main(String args[]) 
   {
	Set vowels= new HashSet<>();
		
	// דוגמה להוספה
	vowels.add("A");
	vowels.add("E");
	vowels.add("I");

	// אנו לא יכולים להכניס אלמנטים בהתבסס על מיקום למבנה נתונים Set
	System.out.println(vowels);
		
	Set set = new HashSet<>();
	set.add("O");
	set.add("U");
	
	// הוספת אלמנטים של מבנה נתונים Set לאותיות
	vowels.addAll(set);
	System.out.println(vowels);
	
	// דוגמה לניקוי כדי לרוקן את המבנה נתונים
	set.clear();
		
	// דוגמה לגודל
	System.out.println("letters set size = " + vowels.size());
		
	vowels.clear();
	vowels.add("E"); vowels.add("E");vowels.add("I"); vowels.add("O");
	System.out.println("Given set contains E element or not? = " + vowels.contains("E"));
		
   }
}

פלט:-

[A, E, I]
[A, E, U, I, O]
letters set size = 5
Given set contains E element or not? = true

איטרטור במבני נתונים Set ב-Java

להלן דוגמה פשוטה של איטרציה מעל מבני נתונים Set ב-Java.

import java.util.*;

public class SetIteratorExample
{
   public static void main(String[] args) 
   {

	Set set = new HashSet<>();
	for(int i=0; i<5; i++) 
		set.add(i);
		
	Iterator iterator = set.iterator();
	
	// איטרציה פשוטה
	while(iterator.hasNext()){
		int i = (int) iterator.next();
		System.out.print(i + ", ");
	}
	System.out.println("\n" + set);
	
	// שינוי של מבנה נתונים Set באמצעות איטרטור
	iterator = set.iterator();
	while(iterator.hasNext()){
		int x = (int) iterator.next();
		if(x%2 ==0) iterator.remove();
	}
	System.out.println(set);
		
	// שינוי במבנה הקבוצה בעת איטרציה
	iterator = set.iterator();
	while(iterator.hasNext()){
                // חריגת שינוי מקביליות כאן
		int x = (int) iterator.next(); 
		if(x==1) set.add(10);
	}
   }
}

המרת מבנה נתונים Set ל-Stream ב-Java

להלן דוגמה פשוטה של המרת מבנה נתונים Set ל-Stream ב-Java וביצוע פעולות מסוימות על פי הדרישות שלנו.

import java.util.*;

public class SetToStream {

   public static void main(String[] args) {
	Set vowelsSet = new HashSet<>();
	// דוגמה להוספה
	vowelsSet.add("a");
	vowelsSet.add("e");
	vowelsSet.add("i");
	vowelsSet.add("o");
	vowelsSet.add("u");
		
	// המרת הקבוצה לזרם
	vowelsSet.stream().forEach(System.out::println);
   }
}

פלט:-

a
e
u
i
o

Java SE 9 Set

בגרסה 9 של Java SE, תוסיף חברת Oracle מספר שיטות יעילות לממשק Set. נוכל להבין אותן טוב יותר דרך דוגמאות פשוטות ושימושיות. יש לך הסבר מפורט בקורס שלי ב-"Java SE 9: שיטות מפענחות של סט" למידה עליהם. זהו, סיכום מהיר על Set ב-Java. אני מקווה שדוגמאות אלו יעזרו לך להתחיל עם תכנות מבני נתונים של Set ב-Java. תודה על קריאת הקורסים שלי. בבקשה השאירו לי תגובה אם אהבתם את הקורסים שלי או יש לכם הערות, הצעות או שגיאות כלשהן.

Source:
https://www.digitalocean.com/community/tutorials/java-set