Set

Set یکی از interface های اصلی Collection Framework جاواست که برای نگه داری یک مجموعه بدون تکرار از آن استفاده می‌شود، زیر کلاس‌های مختلفی همچون TreeSet، HashSet و LinkedHashSetدر جاوا وجود دارند که هر کدام با استفاده از الگوریتم‌ها و ساختمان داده‌های متفاوت به نحوی مفهوم “مجموعه بدون تکرار” را پیاده سازی کرده‌اند. null نیز می‌تواند یک مقدار منحصر به فرد در نظر گرفته شود لذا هر Set می‌تواند حداکثر یک مقدار null نیز داشته باشد. کاربردهای Setبه صورت کلی عبارت‌اند از :

  • نگه داری یک مجموعه بدون تکرار
  • صرفه جویی حافظه در الگوریتم‌های جست و جوی پیشرفته (با تشخیص گره‌های تکراری)
  • تشخیص عضویت یک شیء در مجموعه با بار محاسباتی کم.
  • محاسبه سریع اشتراک دو مجموعه

متدهای Set در جدول زیر آمده‌اند، کلاس‌هایی که از کلاس Setارث بری دارند موظف هستند این متدها را پیاده سازی کنند.

متد کاربرد
add(Object o) یک عنصر جدید به Set اضافه می‌کند.
addAll(Collection c) تمام اعضای یک کالکشن دیگر را به Set اضافه می‌کند.
clear() تمام اعضای داخل Set را حذف می‌کند.
contains(Object o) وجود یک عنصر در Set را بررسی می‌کند.
containsAll(Collection c) اگر تمام اعضای کالکشن c در Set فعلی وجود داشته باشند true بر می‌گرداند.
equals(Ojbect o) Set فعلی را با Set دیگری مقایسه می‌کند.
hashCode() HashCode کل Setرا محاسبه می‌کند.
isEmpty() بررسی می‌کند که Setخالی است یا خیر؟
iterator() یک iterator برای پیمایش Set بر می‌گرداند.
remove(Object o) یک عنصر را از Set حذف می‌کند.
removeAll(Collection c) تمام عناصر یک کالکشن دیگر را از Set فعلی حذف می‌کند.
retainAll(Collection c) اشتراک Set فعلی را با کالکشن دیگر محاسبه می‌کند و سایر اعضا را حذف می‌کند.
size() تعداد عناصر داخل Set را بر می‌گرداند.
Object[] toArray() عناصر را در داخل یک آرایه در اختیار ما قرار می‌دهد.

در ادامه با دو مثال با Setآشنا می‌شویم و مثال‌های بیشتر را به آموزش‌های بعدی موکول می‌کنیم. در مثال اول یک Set ایجاد می‌کنیم و در انتها متوجه می‌شویم که عنصر تکراری در آن نگه داری نمی‌شود.

import java.util.HashSet;
import java.util.Set;

public class SetDemo 
{
    public static void main(String[] args) 
    {
        Set set = new HashSet();

        set.add(null);
        set.add("Jenny");
        set.add("Jenny");
        set.add("Jenny");
        set.add("Azhar");
        set.add(null);
        set.add("Azhar");

        System.out.println(set);
    }
}
[Azhar, null, Jenny]

همانطور که مشاهده می‌کنید با اینکه عنصر “Jenny” سه بار و عنصر null دوبار به مجموعه اضافه شدند در نتیجه نهایی از هر عنصر تنها یک نمونه وجود دارد. در مثال بالا ابتدا یک شیء از Set ایجاد کردیم، چون Setتنها یک interface است برای استفاده از new و ساخت یک شیء واقعی باید از یکی از زیر کلاس‌های آن استفاده کنیم که در اینجا از HashSetکه بعداً با آشنا می‌شویم استفاده کردیم. پس از ساخت Setبا استفاده از متد add عناصری را به آن اضافه کردیم. در مثال دوم با retainAll آشنا می‌شویم .

import java.util.HashSet;
import java.util.Set;

public class SetDemo 
{
    public static void main(String[] args) 
    {
        Set A = new HashSet();
        Set B = new HashSet();
        A.add(2);
        A.add(4);
        A.add(6);

        B.add(2);
        B.add(4);
        B.add(5);

        System.out.println(A);
        System.out.println(B);

        A.retainAll(B);
        System.out.println(A);
    }
}

[2, 4, 6]
[2, 4, 5]
[2, 4]

در کد قبل دو مجموعه به نام‌های A و B ایجاد می‌کنیم، مجموعه اول شامل اعداد 2، 4، 6 و مجموعه دوم شامل اعداد 2، 4، 5 خواهد بود، پس از استفاده از retainAll اعضایی از A که در مجموعه B قرار ندارند از A حذف می‌شوند و نتیجه به صورت اشتراک دو مجموعه خواهد بود.