بررسی اینترفیس Collection
کلاس های ساختمان داده در جاوا اینترفیس Collection رو پیادهسازی میکنن.
کلاس های ساختمان داده در جاوا داخل پکیج java.util تعریف شدن؛ بجز map، کلاس های ساختمان داده در جاوا اینترفیس Collection رو پیادهسازی میکنن و از این رو معروف به کالکشن (Collection) ها هستند.
در تصویر زیر سلسله مراتب ارث بری کلاس های کالکشن (ساختمان داده) در جاوا به صورت UML نمایش داده شده است.
همینطور که در تصویر هم مشخصه تمام کلاس ها به صورت مستقیم یا غیر مستقیم اینترفیس کالکشن رو پیادهسازی میکنن؛ تصویر به سه بخش تقسیم میشه، در بخش شماره 1 اینترفیس ها قرار دارن، در بخش شماره 2 کلاس های ابستراکت (انتزاعی) و در بخش شماره 3 پیاده سازی های کامل از کلاس های کالکشن قرار گرفته است.
در اینترفیس Collection یک سری توابع مشترک بین تمام کلاس های ساختار داده در جاوا تعریف شده است در زیر به صورت UML توابع تعریف شده در Collection توضیح داده شده است.
| <<interface>> | |
|---|---|
| java.util.Collection<E> | |
| +add(e: E): boolean | یک عنصر به کالکشن اضافه میکنه. |
| +addAll(collection: Collection<e extends E>) | تمام عناصر یک کالکشن رو به کالکشن فعلی اضافه می کنه. |
| +clear(): void | تمام عناصر موجود در کالکشن رو حذف میکنه. |
| +contains(o: Object): boolean | اگه عنصر o داخل کالکشن وجود داشته باشه true رو بر میگردونه. |
| +containsAll(c: Collection<?>): boolean | اگه تمام عناصر کالکشن c داخل کالکشن وجود داشته باشه مقدار true رو بر میگردونه. |
| +isEmpty(): boolean | اگه عنصری داخل کالکشن وجود نداشته باشه مقدار true رو برمیگردونه. |
| +remove(o: Object) | عنصر o رو از کالکشن حذف میکنه. |
| +removeAll(c: Collection<?>): boolean | تمام عناصر مشترک با کالکشن c رو از کالکشن حذف میکنه. |
| +retainAll(c: Collection<?>): boolean | تمام عناصر داخل کالکشن رو حذف می کنه و تنها عناصر مشترک با کالکشن c رو نگه میداره. |
| +size(): int | تعداد عناصر داخل کالکشن رو بر میگردونه. |
| +toArray(): Object[] | یک آرایه از نوع آبجکت از عناصر داخل کالکشن بر میگردونه. |
| +toArray(t: T[]): T[] | یک آرایه از عناصر داخل کالکشن بر میگردونه. |
در هر کدوم از کالکشن های زیر نام یک سری شهر ذخیره میکنیم و به بررسی متد های گفته شده در بالا داخل مثال می پردازیم.
public class TestCollection {
public static void main(String[] args) {
ArrayList<String> collection = new ArrayList<>();
collection.add("Tehran");
collection.add("Arak");
collection.add("Mashhad");
collection.add("Qom");
System.out.println("A list of cities in collection: ");
System.out.println(collection);
System.out.println("\nIs Mashhad in collection? " + collection.contains("Mashhad"));
collection.remove("Mashhad");
System.out.println("\n"+ collection.size() + " cities in collection now");
Collection<String> collection1 = new ArrayList<>();
collection1.add("Tabriz");
collection1.add("Shiraz");
collection1.add("Zanjan");
collection1.add("Arak");
System.out.println("\nA list of cities in collection1: ");
System.out.println(collection1);
ArrayList<String> collection2 = (ArrayList<String>) collection.clone();
collection2.addAll(collection1);
System.out.println("\nCities in collection or collection1 are: ");
System.out.println(collection2);
collection2 = (ArrayList<String>) collection.clone();
collection2.retainAll(collection1);
System.out.println("\nCities in collection and collection1: ");
System.out.println(collection2);
collection2 = (ArrayList<String>) collection.clone();
collection2.removeAll(collection1);
System.out.println("\nCities in collection but not in collection1: ");
System.out.println(collection2);
}
}
پیمایش در کالکشن ها
هر Collection یک Iterable است؛ با صدا زدن متد iterator در Iterable میتونیم به پیمایش عناصر کالکشن بپردازیم.
Iterator یک طراحی الگو کلاسیک است که بدون معلوم شدن جزئیات ذخیره سازی عناصر، باهاش به پیمایش عناصر کالکشن می پردازیم.
اینترفیس Collection از Iterable ارث بری میکنه و داخل Iterable یک متد وجود داره به نام iterator که این متد یک پیادهسازی از Iterator رو بر میگردونه.
در کتابخونه های جاوا هر کلاسی که Iterable رو پیادهسازی کرده باشه میتونه از حلقه ی foreach استفاده کنه.
در نمودار UML زیر رابطه ی بین Collection، Iterable و Iterator شرح داده شده است.
در زیر نمودار UML اینترفیس Iterable به همراه متد و توضیحاتشون اورده شده.
| <<interface>> | |
|---|---|
| java.lang.Iterable<E> | |
| +iterator(): Iterator<E> | یک نمونه از Iterator رو برای اعضای کالکشن بر میگردونه. |
| +forEach(action: Consumer<? super E>) | به جستجو بین اعضای کالکشن می پردازه. |
در زیر نمودار UML اینترفیس Iterator در جاوا به همراه متدها و توضیحاتشون اورده شده است.
| <<interface>> | |
|---|---|
| java.util.Iterator<E> | |
| +hasNext(): boolean | اگه عنصر بعدی برای پیمایش وجود داشته باشه true رو بر میگردونه. |
| +next(): E | عنصر بعدی رو از Iterator فعلی بر میگردونه. |
| +remove(): void | اخرین عنصری که در Iterator با next بهش رسیدیم رو حذف میکنه. |
در مثال زیر با استفاده از Iterator به پیمایش در Collection می پردازیم.
Collection<String> collection = new ArrayList<>();
collection.add("Tehran");
collection.add("Arak");
collection.add("Mashhad");
collection.add("Qom");
Iterator<String> iterator = collection.iterator();
while(iterator.hasNext()){
String city = iterator.next();
System.out.print(city.toUpperCase() + " ");
}
System.out.println();
در مثال زیر با استفاده از متد forEach به پیمایش در Collection می پردازیم.
Collection<String> collection = new ArrayList<>();
collection.add("Tehran");
collection.add("Arak");
collection.add("Mashhad");
collection.add("Qom");
collection.forEach(city -> System.out.print(city.toUpperCase()));
System.out.println();
خلاصه
- اکثر کلاس های ساختمان داده در جاوا، اینترفیس Collection رو پیادهسازی میکنن.
- متد های مشترک بین کلاس های ساختمان داده در جاوا (add, addAll, remove, removeAll, retainAll, contains,...) در اینترفیس Collection تعریف شده اند.
- اینترفیس کالکشن در جاوا از کلاس Iterable ارث بری میکنه.
- در Iterable یک متد وجود داره به نام iterator که برای پیمایش بین عناصر کالکشن یک نمونه از Iterator رو بر میگردونه.
- در اینترفیس iterator متد های hasNext, next و remove برای پیمایش و حذف عناصر از کلاس کالکشن مورد نظر تعریف شده است.
بازخورد و دیدگاه ها
شروع مطالب ساختمان داده در جاوا