رابطهی Set هیچ متد جدیدی به رابطهی Collection اضافه نمیکند. پیادهسازی اصلی Set در Collections Framework کلاس HashSet است. از نظر داخلی، یک HashSet یک نمونه از HashMap (کلاسی که بعداً بررسی خواهد شد) را در خود جای داده و بهعنوان نمایندهی HashSet عمل میکند.
همانطور که قبلاً دیدید، آنچه یک Set به یک Collection اضافه میکند، منع تکرار (no duplicates) است. آنچه نسبت به رابطهی List از دست میدهید، این است که عناصر در ترتیب خاصی ذخیره نمیشوند. بعید است که عناصر را به همان ترتیبی که به Set اضافه کردهاید پیمایش کنید.
این موضوع را در مثال زیر ببینید:
خروجی این کد:
six
four
one
two
three
five
برخی پیادهسازیهای Set همیشه ترتیب ثابتی هنگام پیمایش ارائه میدهند، اما از آنجا که این تضمین شده نیست، کد شما نباید به آن وابسته باشد.
اگر میخواهید عناصر را در ترتیب مشخص و تکرارپذیر پیمایش کنید، از پیادهسازی LinkedHashSet استفاده کنید که ترکیبی از یک Set و یک لیست پیوندی داخلی است.
اولین extension از Set رابطهی SortedSet است. این رابطه عناصرش را بر اساس یک منطق مقایسهای خاص مرتب نگه میدارد. Collections Framework یک پیادهسازی از SortedSet ارائه میدهد: کلاس TreeSet.
TreeSet پیادهسازیای است که برای مقایسهی اشیاء موجود نیاز به ابزار مقایسه دارد. میتوانید هنگام ساخت یک TreeSet یک Comparator ارسال کنید، یا رابطهی Comparable را برای عناصری که در TreeSet قرار میدهید پیادهسازی کنید. اگر هر دو را ارائه دهید، Comparator اولویت دارد.
رابطهی SortedSet متدهای جدیدی به Set اضافه میکند:
first() و last() به ترتیب کوچکترین و بزرگترین عنصر مجموعه را برمیگردانندheadSet(toElement) و tailSet(fromElement) زیرمجموعههایی شامل عناصر کوچکتر از toElement یا بزرگتر یا مساوی fromElement را برمیگردانندsubSet(fromElement, toElement) زیرمجموعهای از عناصر بین fromElement و toElement را برمیگرداند مقادیر toElement و fromElement لزوماً عناصر مجموعهی اصلی نیستند. اگر باشند، طبق قرارداد رایج، toElement در نتیجه لحاظ نمیشود ولی fromElement لحاظ میشود.
مثال زیر را در نظر بگیرید:
خروجی این کد:
sub set = [b, c]
سه زیرمجموعهای که این متدها برمیگردانند، ویوهایی (views) روی مجموعهی اصلی هستند. کپیای ساخته نمیشود. یعنی هر تغییری که روی این زیرمجموعهها ایجاد کنید، در مجموعهی اصلی منعکس میشود و بالعکس.
میتوانید از طریق این زیرمجموعهها عناصر را از مجموعهی اصلی حذف یا اضافه کنید. اما یک نکته مهم وجود دارد: این سه زیرمجموعه مرزهایی که بر اساس آنها ساخته شدهاند را به خاطر میسپارند. برای حفظ سازگاری، اضافه کردن عنصری خارج از این مرزها از طریق زیرمجموعه غیرمجاز است. مثلاً اگر یک headSet بگیرید و سعی کنید عنصری بزرگتر یا مساوی toElement اضافه کنید، خطای IllegalArgumentException دریافت خواهید کرد.
Java SE 6 توسعهی SortedSet را با اضافه کردن متدهای بیشتر معرفی کرد. کلاس TreeSet بهگونهای بازطراحی شد که رابطهی NavigableSet را هم پیادهسازی کند. بنابراین میتوانید از همان کلاس برای هر دو رابطه استفاده کنید.
NavigableSet برخی متدها را overloaded میکند:
headSet()، tailSet() و subSet() میتوانند یک آرگومان boolean اضافی برای مشخص کردن لحاظ شدن یا نشدن مرزها دریافت کنند.متدهای جدید دیگری هم اضافه شدهاند:
ceiling(element) و floor(element) به ترتیب کوچکترین عنصر بزرگتر یا مساوی، و بزرگترین عنصر کوچکتر یا مساوی element مورد نظر را برمیگردانند. اگر چنین عنصری وجود نداشته باشد، null برمیگردانند.lower(element) و higher(element) به ترتیب بزرگترین عنصر کوچکتر، و کوچکترین عنصر بزرگتر از element مورد نظر را برمیگردانند. اگر چنین عنصری وجود نداشته باشد، null برمیگردانند.pollFirst() و pollLast() به ترتیب کوچکترین و بزرگترین عنصر مجموعه را برمیگردانند و حذف میکنند.علاوه بر این، NavigableSet پیمایش عناصر به ترتیب نزولی را هم ممکن میسازد. دو روش برای این کار وجود دارد:
descendingIterator(): یک Iterator معمولی برمیگرداند که مجموعه را به ترتیب نزولی پیمایش میکند.descendingSet(): یک NavigableSet جدید برمیگرداند که ویویی روی همین مجموعه است و طوری رفتار میکند که گویی مجموعهی اصلی به ترتیب معکوس مرتب شده است.مثال زیر این موضوع را نشان میدهد:
خروجی این کد:
sorted strings = [a, b, c, d, e, f]
reversed strings = [f, e, d, c, b, a]
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://dev.java/learn/