آموزش جامع برنامه نویسی جاوا به زبان ساده — بخش سیزدهم: مجموعهها و نقشهها
مجموعهها سازهای از جنس کلکسیون هستند که حاوی عناصر منحصربهفردی هستند یعنی هیچ آیتم تکراری در آنها وجود ندارد. با اینکه لیست میتواند شامل چند شیء یکسان باشد (صدها بار) اما یک مجموعه هر وهله خاص را تنها یکبار میتواند نگهداری کند. کلکسیون مجموعه جاوا تنها میتواند اشیا را ذخیره کند و تعریف کاملاً مشخصی در مورد نحوه رفتار آن وجود دارد.
در بخش دوازدهم آموزش جامع برنامهنویسی جاوا، با لیستها آشنایی پیدا کردیم.
از آنجا که مجموعه یک اینترفیس است میتوان بهطور مستقیم وهلهای از آن ایجاد کرد. یکی از محبوبترین پیادهسازیها HashSet است که استفاده از آن آسان و شبیه لیست است.
کارهایی که میتوان با مجموعهها انجام داد:
- قرار دادن چیزی در مجموعه
- پرسیدن اندازه مجموعه در هرلحظه
- خارج کردن چیزی از مجموعه
خصوصیتی که مجموعه را متمایز میکند این است که تضمین میکند همه عناصرش منحصربهفرد هستند ولی ترتیب عناصر در مجموعه مهم نیستند. کد زیر را ملاحظه کنید:
Set<Integer> setOfIntegers = new HashSet<Integer>();
setOfIntegers.add(Integer.valueOf(10));
setOfIntegers.add(Integer.valueOf(11));
setOfIntegers.add(Integer.valueOf(10));
for (Integer i: setOfIntegers) {
l.info("Integer value is: " + i);
}
ممکن است انتظار داشته باشیم که مجموعه سه عنصر در خود داشته باشد اما این مجموعه تنها دو عنصر دارد زیرا شیء Integer که مقدار 10 دارد تنها یکبار اضافه میشود.
هنگام تکرار عملیات بر روی مجموعه باید این مسئله را در نظر داشت، مانند مثال زیر:
Set<Integer> setOfIntegers = new HashSet();
setOfIntegers.add(Integer.valueOf(10));
setOfIntegers.add(Integer.valueOf(20));
setOfIntegers.add(Integer.valueOf(30));
setOfIntegers.add(Integer.valueOf(40));
setOfIntegers.add(Integer.valueOf(50));
Logger l = Logger.getLogger("Test");
for (Integer i: setOfIntegers) {
l.info("Integer value is: " + i);
}
ممکن است ترتیب پرینت شدن عناصر مجموعه از ترتیب وارد شدن آنها به مجموعه متفاوت باشد زیرا مجموعه منحصربهفرد بودن عناصر را تضمین میکند ولی ترتیب آنها را نه. اگر کد قبل را در متد ()main کلاس person بچسبانید و کد را اجرا کنید میتوانید این نتیجه را بهطور عملی ببینید.
نقشهها
نقشه کلکسیون مفیدی از سازهها است که میتوان برای ارتباط اشیا (کلید) با شیء دیگر (مقدار) استفاده کرد. چنانکه ممکن است تصور کنید کلید نقشه باید منحصربهفرد باشد و برای دریافت مقدار در زمانهای بعدتر مورد استفاده قرار میگیرد. کلکسیون نقشه جاوا تنها میتواند اشیا را نگهداری کند و روش مشخصی برای نحوه رفتار آن وجود دارد.
از آنجا که نقشه یک اینترفیس نیست، نمیتوان آن بهطور مستقیم وهلهای از آن ساخت. یکی از پیادهسازیهای رایج نقشه HashMap است.
کارهایی که میتوان با نقشهها انجام داد:
- چیزی را در نقشه قرار داد.
- چیزی را از نقشه برداشت.
- مجموعهای از کلیدها به نقشه داد تا روی آن پیمایش انجام شود.
برای اینکه بتوانیم چیزی را در نقشه قرار دهیم باید شیئی داشته باشیم که کلید خود را نشان دهد و آن شیء مقدار آن را بازنمایی کند:
public Map<String, Integer> createMapOfIntegers() {
Map<String, Integer> mapOfIntegers = new HashMap<>();
mapOfIntegers.put("1", Integer.valueOf(1));
mapOfIntegers.put("2", Integer.valueOf(2));
mapOfIntegers.put("3", Integer.valueOf(3));
//...
mapOfIntegers.put("168", Integer.valueOf(168));
return mapOfIntegers;
}
در این مثال نقشه شامل اعداد صحیح Integer است که کلیدهای آنها از نوع رشته هستند و درواقع بازنمایی متنی آنها هستند. برای دریافت مقدار یک عدد صحیح به بازنمایی رشتهای آن نیازمند هستیم:
mapOfIntegers = createMapOfIntegers();
Integer oneHundred68 = mapOfIntegers.get("168");
استفاده از مجموعهها با نقشه
در مواردی ممکن است به نقشه مراجعه کنید و بخواهید بر روی تمام مجموعه محتوای آن راه بروید. در این حالت، به مجموعهای از کلیدها برای نقشه نیاز هست:
Set<String> keys = mapOfIntegers.keySet();
Logger l = Logger.getLogger("Test");
for (String key: keys) {
Integer value = mapOfIntegers.get(key);
l.info("Value keyed by + key + is + value + ");
}
توجه کنید که متد ()toString از نوع عدد صحیح که از نقشه دریافت شده است بهطور خودکار موقع استفاده از فراخوانی Logger فراخوان میشود. نقشه مجموعهای از کلیدها بازمیگرداند زیرا نقشه دارای کلید است و هر کلید نیز منحصربهفرد است. منحصربهفرد بودن (عدم ترتیب) خصوصیت متمایز کنده یک مجموعه است (و به همین دلیل هم نیازی به متد ()KeyLisy ندارد.)
در بخش چهاردهم از این سلسله آموزشها با بحث آرشیو کردن کدهای جاوا آشنا میشویم.