CodeGym /בלוג Java /Random-HE /סט ג'אווה
John Squirrels
רָמָה
San Francisco

סט ג'אווה

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

מה זה Java Set

Set הוא ממשק מ-Java Collection Framework, אך Set אינו אוסף מסודר, בניגוד ל- List . זה אומר שרכיבי Java Set נשמרים ללא סדר מסוים. אז אין שליטה על המיקום שבו אתה יכול להכניס אלמנט. כמו כן, אינך יכול לגשת לאלמנטים לפי האינדקס שלהם. מבחינה מתמטית, סט הוא אוסף של אלמנטים ייחודיים. למעשה, מדובר באוסף לא מסודר (אוסף לא מסודר), שלא ניתן לאחסן בו אלמנטים זהים. אם תוסיף בכוונה רכיב משוכפל לסט , הפעולה הזו תתעלם והסט לא ישתנה. עם זאת מותר לאחסן בו רכיב ריק אחד.

הגדר יישומים

Java Set הוא ממשק, אז אתה צריך להשתמש באחד המימושים שלו כדי ליצור אובייקטים. אלה הם HashSet , TreeSet ו- LinkedHashSet . ב- Set s, כל אלמנט מאוחסן רק במופע אחד, והטמעות שונות של Set משתמשות בסדר שונה לאחסון אלמנטים. ב- HashSet , סדר האלמנטים נקבע על ידי אלגוריתם מורכב. אם סדר האחסון חשוב לך, השתמש במיכל TreeSet , המאחסן אובייקטים ממוינים בסדר עולה לפי סדר השוואה, או LinkedHashSet , המאחסן אלמנטים בסדר נוסף. לרוב משתמשים בסטים לבדיקת חברות כך שתוכלו לבדוק בקלות אם אובייקט שייך לסט נתון, כך שבפועל נבחר בדרך כלל מימוש HashSet שמותאם לחיפוש מהיר. HashSet הוא אוסף שמשתמש בערכי ה-hash שלהם המוחזרים בשיטת hashCode() כדי לאחסן אלמנטים באופן פנימי. כלומר, בתוך ה- HashSet<E> מאוחסן האובייקט HashMap<E, Object>, המאחסן את הערכים של ה- HashSet כמפתחות . שימוש בקודי hash מאפשר לך לחפש במהירות, להוסיף ולהסיר אלמנטים מ- Set . LinkedHashSet הוא HashSet המאחסן גם אלמנטים ברשימה מקושרת. HashSet רגיל אינו שומר על סדר אלמנטים. ראשית, רשמית זה פשוט לא קיים, ושנית, אפילו הסדר הפנימי יכול להשתנות באופן דרמטי כאשר רק אלמנט אחד נוסף. ואתה יכול לקבל איטרטור מ- LinkedHashSet ולהשתמש בו כדי לעבור על כל האלמנטים בסדר המדויק שבו הם נוספו ל- LinkedHashSet . לא לעתים קרובות, אבל לפעמים זה יכול להיות מאוד הכרחי. A TreeSet הוא אוסף המאחסן אלמנטים כעץ לפי ערך. בתוך TreeSet<E> נמצא TreeMap<E, Object> המאחסן את כל הערכים הללו. ומפת העץ הזו משתמשת בעץ בינארי מאוזן אדום-שחור כדי לאחסן אלמנטים. לכן, יש לו פעולות add() , remove() , contains() מהירות מאוד.

צור אובייקט סט

כדי ליצור אובייקט סט , אתה יכול להשתמש באחד מהטופס הבא:
Set<Integer> intSet = new HashSet<>();
Set<String> vSet = new HashSet<>();
Set mySet = new LinkedHashSet();
HashSet<String> myHashset = new HashSet<>();
הנה דוגמה פשוטה, שבה אנו יוצרים 2 Set s, 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 Methods

הנה כמה מהשיטות החשובות של Java Set :
  • add(E e) בוליאני . מוסיף את הרכיב שצוין לקבוצה אם הוא לא קיים כבר (פעולה אופציונלית).

  • הסר בוליאני (Object o) . מסיר את הרכיב שצוין מקבוצה זו אם הוא קיים (פעולה אופציונלית).

  • boolean removeAll(אוסף ג) . מסיר מקבוצה זו את כל הרכיבים שלו הכלולים באוסף שצוין (פעולה אופציונלית).

  • boolean retainAll(אוסף ג) . שומר רק על הרכיבים בקבוצה זו הכלולים באוסף שצוין (פעולה אופציונלית).

  • void clear() . מסיר את כל האלמנטים מהסט.

  • Iterator iterator() . מחזירה איטרטור מעל האלמנטים בקבוצה זו.

  • int size() . הוא משמש כדי לקבל את מספר האלמנטים בסט.

  • boolean isEmpty() . כדי לבדוק אם הסט ריק או לא.

  • boolean contains(Object o) . מחזירה true אם קבוצה זו מכילה את האלמנט שצוין.

  • Iterator iterator() . מחזירה איטרטור מעל האלמנטים בקבוצה זו. האלמנטים מוחזרים ללא סדר מסוים.

  • Object[] toArray() . מחזירה מערך המכיל את כל האלמנטים בקבוצה זו. אם הסט הזה נותן ערבויות לגבי הסדר שבו הרכיבים שלו מוחזרים על ידי האיטרטור שלו, שיטה זו חייבת להחזיר את האלמנטים באותו סדר.

השיטות דומות לאלו של ArrayList , פרט לכך שמתודה add(Object o) מוסיפה אובייקט לסט רק אם הוא עדיין לא שם. ערך ההחזרה של השיטה נכון אם האובייקט נוסף, ו-false אחרת. ישנן גם כמה שיטות שעברו בירושה מ- Collection<> ממשק: parallelStream() , removeIf() , stream() ו- forEach() שיטת בירושה מ- java.lang.Iterable Interface.

Java Set דוגמה לפעולות עיקריות

בדוגמה זו, אנו יוצרים מערך של מחרוזות ולאחר מכן מעבירים אותו ל- mySet באמצעות פעולת Arrays.asList . לאחר מכן אנו מסירים עוד כמה אלמנטים ומוסיפים עוד כמה. במקרה זה, אחד האלמנטים בסט כבר קיים: הוא לא יתווסף. ננסה גם את הפעולות של בדיקת ריקנות 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 הוא חלק ממסגרת Java Collections.

  • שיעורים מיושמים: AbstractSet , ConcurrentHashMap.KeySetView , ConcurrentSkipListSet , CopyOnWriteArraySet , EnumSet , HashSet , JobStateReasons , LinkedHashSet , TreeSet .

  • יישומי הסט הפופולריים ביותר הם HashSet , LinkedHashSet ו- TreeSet .

  • סדר רכיבי HashSet נקבע על ידי אלגוריתם מורכב. אם סדר האחסון חשוב לך, השתמש במיכל TreeSet , המאחסן אובייקטים ממוינים בסדר עולה לפי סדר השוואה, או LinkedHashSet , המאחסן אלמנטים בסדר נוסף.

  • לרוב, סטים משמשים לבדיקת חברות. כלומר, לבדוק האם עצם שייך לקבוצה נתונה במובן המתמטי. אז לרוב מכל יישומי ה-Set בפועל, בדרך כלל נבחר HashSet . יישום זה מותאם לחיפוש מהיר.

  • אינך יכול להוסיף אלמנטים כפולים לסט, כך שאתה יכול להשתמש ביישומים של ממשק ה-Set כדי לאחסן אלמנטים ייחודיים.

  • Set מאפשר לך להוסיף רק אלמנט null אחד.

  • הסט אינו רשימה ואינו תומך באינדקסים או מיקומים של האלמנטים שלו.

הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION