Set یک مجموعهی بدون ترتیب است که برخلاف List تضمین میشود هیچ مقدار تکراری نداشته باشد.
پارامتر نوع جنریکِ رابط Set نوع عناصری را مشخص میکند که در Set قرار میگیرند:
Set<Integer> ints = Set.of(1, 2, 3);
Set<String> strings = Set.of("alpha", "beta", "gamma");
Set<Object> mixed = Set.of(1, false, "foo");
توجه کنید که متد Set.of() یک نمونهی Set غیرقابل تغییر میسازد.
اگر بخواهید متدهایی مانند add و remove را روی این نمونه فراخوانی کنید، در زمان اجرا یک استثنا رخ میدهد.
برای ساختن یک Set قابل تغییر، باید نمونهای از کلاسی بسازید که رابط Set را پیادهسازی میکند.
پرکاربردترین کلاس توکاری که این رابط را پیادهسازی میکند، کلاس HashSet است.
Set<Integer> ints = new HashSet<>();
رابط Set از رابطهای Collection و Iterable ارث میبرد و بنابراین متدهای زیادی را با انواع دیگر مجموعهها به اشتراک میگذارد.
اما یک تفاوت قابل توجه با رابط Collection این است که متدهایی مانند add و remove یک boolean برمیگردانند (بهجای void) که نشان میدهد آیا عنصر در لحظهی فراخوانی آن متد در مجموعه وجود داشته است یا نه:
Set<Integer> set = new HashSet<>();
set.add(1);
// => true
set.add(2);
// => true
set.add(1);
// => false
set.size();
// => 2
set.contains(1);
// => true
set.contains(3);
// => false
set.remove(3);
// => false
set.remove(2);
// => true
set.size();
// => 1
به نظر نمیرسد نوستالژی شما برای کارتهای Blorkemon™️ فروکش کند. حتی دوباره شروع به جمعآوری آنها کردهاید و دوستانتان را هم دارید با خودتان همراه میکنید.
در این تمرین، از اینترفیس Set استفاده میکنید تا مجموعهتان را مدیریت کنید، چون وقتی هدفتان بهدستآوردن همهی کارتهای موجود باشد، کارتهای تکراری اهمیتی ندارند.
تازه انبار قدیمی کارتهای Blorkemon™️ خودتان را پیدا کردهاید! این انبار پر از کارتهای تکراری است، پس وقت آن رسیده که با حذف تکراریها یک مجموعهی جدید شروع کنید.
دلتان میخواهد دوستانتان هم به شور و شوق Blorkemon™️ شما بپیوندند و بهترین راه این است که با دادن یک کارت، مجموعهشان را راه بیندازید.
متد newCollection را پیادهسازی کنید که یک فهرست از کارتها را به یک Set تبدیل میکند که نمایندهی مجموعهی جدید شماست.
GottaSnatchEmAll.newCollection(List.of("Newthree", "Newthree", "Newthree"));
// => {"Newthree"}
وقتی مجموعهای داشته باشید، بهنوعی زندگی خودش را پیدا میکند و باید رشد کند.
متد addCard را پیادهسازی کنید که یک کارت جدید و مجموعهی فعلی کارتهای جمعآوریشدهی شما را میگیرد.
این متد باید کارت جدید را، در صورتی که از قبل وجود نداشته باشد، به مجموعه اضافه کند و یک boolean برگرداند که نشان میدهد مجموعه بهروزرسانی شده است یا نه.
Set<String> collection = GottaSnatchEmAll.newCollection("Newthree");
GottaSnatchEmAll.addCard("Scientuna",collection);
// => true
collection.contains("Scientuna");
// => true
دلتان میخواهد دوستانتان هم به شور و شوق Blorkemon™️ شما بپیوندند، پس وقت آن رسیده که معامله را شروع کنید!
وقتی با دوستانتان معامله میکنید، هر معاملهای ارزش انجام دادن ندارد، یا اصلاً امکان انجام ندارد. فقط در صورتی باید معامله کنید که هم شما و هم دوستتان کارتی داشته باشید که دیگری ندارد.
متد canTrade را پیادهسازی کنید که مجموعهی فعلی شما و مجموعهی یکی از دوستانتان را میگیرد.
این متد باید بر اساس قواعد بالا یک boolean برگرداند که نشان میدهد معامله ممکن است یا نه.
Set<String> myCollection = Set.of("Newthree");
Set<String> theirCollection = Set.of("Scientuna");
GottaSnatchEmAll.canTrade(myCollection, theirCollection);
// => true
شما و دوستان علاقهمندتان به Blorkemon™️ جمع میشوید و از خودتان میپرسید کدام کارتها از همه رایجترند.
متد commonCards را پیادهسازی کنید که فهرستی از مجموعهها را میگیرد و مجموعهای از کارتها را برمیگرداند که همهی مجموعهها آن را دارند.
GottaSnatchEmAll.commonCards(List.of(Set.of("Scientuna"), Set.of("Newthree","Scientuna")));
// => {"Scientuna"}
آیا شما و دوستانتان روی هم همهی کارتهای Blorkemon™️ را دارید؟
متد allCards را پیادهسازی کنید که فهرستی از مجموعهها را میگیرد و مجموعهای از همهی کارتهای متفاوت موجود در همهی مجموعهها را با هم برمیگرداند.
GottaSnatchEmAll.allCards(List.of(Set.of("Scientuna"), Set.of("Newthree","Scientuna")));
// => {"Newthree", "Scientuna"}