סט הוא פשוט אוסף של חפצים ייחודיים. ייחודי פירושו שלא שני אובייקטים יכולים להיות בעלי אותו ערך(ים). בהתאם ליישום הסט, ייתכן שהוא יוזמן או לא. לסט Java, כסוג נתונים מופשטים (ADT), יש כמה פעולות מפתח (כאשר T מייצג כל סוג נתונים כגון int, String או כל אובייקט מחלקה):
boolean add(T item)
: מחזירה true אם הפריט נוסף בהצלחה לסט, ו-false אם הפריט כבר היה בסט.boolean remove(T item)
: מחזירה true אם הפריט הוסר בהצלחה מהסט ו-false אחרת (אם הפריט לא היה בסט).boolean contains(T item)
: מחזירה true אם הפריט נמצא בסט ו-false אחרת.boolean isEmpty()
: מחזירה true אם הסט ריק ו-false אחרת.
contains()
נותנת זמן ריצה נהדר עבור זה: O(1) או O(log n) מורכבות זמן תלוי אם המימוש המשמש הוא a HashSet
או a TreeSet
, בהתאמה. אז למה עשוי סט לשמש? ובכן, אם אי פעם תצטרך לעקוב אחר אובייקטים שונים - כגון מזהים, שמות או מזהים ייחודיים אחרים - ולבדוק לעתים קרובות אם פריט קיים באוסף כזה, סביר להניח שסט הוא בחירה טובה. הנה מקרה שימוש לדוגמה של קבוצה: תאר לעצמך שיש לך רשימה של Student
אובייקטים המייצגים את כל התלמידים בכיתה נתונה. לכל אחד Student
יכול להיות שם ייחודי (מחרוזת) וציון (int) עבור הכיתה הזו. אם תרצה להפנות לרשימה של כל תלמידי א' (ציון >=90) לעתים קרובות, אז זה יהיה מייגע לעבור ברשימה זו ולבדוק את הציון של כל תלמיד בכל פעם. במקום זאת, תוכל להשתמש HashSet
במחרוזות שעוקבת אחר כל תלמידי A בכיתה, ככזו:
- בכל פעם שציונים של התלמידים מתעדכנים, אתה יכול פשוט לבדוק אם הציון החדש של התלמיד גדול או שווה ל-90 או לא.
- אם כן, הוסף אותם לקבוצה של תלמידי A באמצעות
add()
- אם הם כבר היו סטודנטים א', אז פשוט מתעלמים מהפעולה הזו.
- אם לא, הסר אותם מהקבוצה של תלמידי A באמצעות
remove()
- אם הם לא היו תלמידי א' בשלב זה, אז פשוט מתעלמים מהפעולה הזו.
- אם כן, הוסף אותם לקבוצה של תלמידי A באמצעות
contains(“Johnny Appleseed”)
לסט. כמובן, זו רק דוגמה אחת למקרה שימוש עבור סט, וניתן לפתור את הבעיה הספציפית הזו של מעקב אחר תלמידי A בדרכים אחרות.
יישום: HashSet ב-Java ו-Java TreeSet דוגמאות
גםHashSet
ב-Java וגם TreeSet
ב-Java מגיעים ב- java.utils package
. אתה יכול לייבא אותם ככאלה:
// imports everything from Java's util package, including HashSet and TreeSet
import java.util.*;
אוֹ
import java.util.HashSet; // imports only the Java HashSet
import java.util.TreeSet; // imports only the Java TreeSet
ההבדל העיקרי בין ג'אווה HashSet
וג'אווה TreeSet
הוא שה TreeSet
-ממוין, ואילו HashSet
לא. זו הסיבה שיש TreeSet
לו מורכבות זמן O(log n) עבור פעולות מפתח, בעוד HashSet
שיש לו O(1) או מורכבות זמן קבועה; חייבים TreeSet
לשמור על הסדר בכל עת. בנוסף לפעולות ערכת המפתחות שהוזכרו קודם לכן, גם ל- HashSet
וגם TreeSet
ב-Java יש עוד כמה פונקציות מועילות:
void clear()
: מנקה את הסט מכל האובייקטים.int size()
: מחזירה את מספר האובייקטים בערכה.Object clone()
: מחזיר עותק רדוד של הסט.Iterator iterator()
: מחזיר איטרטור לקבוצה, החל מהאובייקט הראשון.
size()
אם אתה רוצה לראות כמה תלמידים יש לך 'A', או clear()
אם אתה רוצה לנקות את הרשימה בסוף הסמסטר. תוכל להשתמש clone()
כדי ליצור ולשמור שיבוט של רשימת תלמידי A בנקודת זמן מסוימת, כגון במהלך דוחות אמצע (בדרך זו השיבוט לא נשאר מעודכן יחד עם המקור).
דוגמה ל-Java HashSet
הנה דוגמה קצרה שלHashSet
s String
בשימוש ב-Java:
import java.util.HashSet;
class HashSetDemo {
public static void main(String[] args)
{
// create a HashSet of Strings
HashSet<String> hs = new HashSet<String>();
// Add elements using the add() method
hs.add("Collin");
hs.add("Bob");
hs.add("Abigail");
// Duplicates will ignored; this statement is useless
hs.add("Collin");
System.out.println(hs);
System.out.println("Bob is in the set (T/F): " + hs.contains("Bob"));
System.out.println("Max is in the set (T/F): " + hs.contains("Max"));
}
}
פלט: --------
[Collin, Bob, Abigail]
Bob is in the set (T/F): true
Max is in the set (T/F): false
דוגמה של Java TreeSet
דוגמה של Java יכולה לעזור לך להבין את התיאוריה. הנה הדוגמה הקצרה של aTreeSet
של String
s בשימוש ב-Java:
import java.util.TreeSet;
class TreeSetDemo {
public static void main(String[] args)
{
// create a TreeSet of Strings
TreeSet<String> ts = new TreeSet<String>();
// Add elements using the add() method.
ts.add("Collin");
ts.add("Bob");
ts.add("Abigail");
// Duplicates will ignored; this statement is useless
ts.add("Collin");
// printing the set prints the names in alphabetical order!
System.out.println(ts);
System.out.println("Bob is in the set (T/F): " + ts.contains("Bob"));
System.out.println("Max is in the set (T/F): " + ts.contains("Max"));
System.out.println("Size of the set: " + ts.size());
ts.clear();
System.out.println("Size of the set after clear(): " + ts.size());
}
}
פלט: -------
[Abigail, Bob, Collin]
Bob is in the set (T/F): true
Max is in the set (T/F): false
Size of the set: 3
Size of the set after clear(): 0
זה הכל! מקווה שזה עזר 😊
GO TO FULL VERSION