Map

Map یکی از interface های اصلی Collection Framework جاواست که برای نگه داری زوج کلید-مقدار (key-value) از آن استفاده می شود و در پکیج java.util.Map قرار دارد. زیر کلاس های مختلفی همچون HashMap ،IdenentityHashMap ،LinkedHashMap ،WeakHashMap و TreeMap در جاوا وجود دارند که هر کدام با استفاده از الگوریتم ها و ساختمان داده های متفاوت به نحوی مفهوم نگه داری زوج کلید-مقدار را پیاده سازی کرده اند. به هر زوج کلید-مقدار در Map یک entry گفته می شود که با استفاده از Map.Entry می توان به آن ها دسترسی داشت و کلید(key) یا مقدار(value) را استخراج کرد. کلید در Map یک عنصر یکتاست ولی مقدار متناظر با آن می تواند یک Object ساده یا پیچده (مثلاً یک لیست) و یا حتی null باشد ، به علاوه ممکن است برای چند کلید مختلف مقادیر تکراری داشته باشیم. null نیز می تواند یک کلید منحصر به فرد در نظر گرفته شود لذا هر Map می تواند حداکثر یک کلید با مقدار null نیز داشته باشد. کاربرد های Map به صورت کلی عبارتند از :

  • قادر باشیم زوج کلید-مقدار را در Map ذخیره کنیم و هر زمان که لازم شد تنها با داشت کلید بتوانیم مقدار متناظر با آن را استخراج کنیم.
  • راهکاری برای تشخیص وجود یا عدم وجود کلید در Map داشته باشیم.
  • راهکاری برای تشخیص وجود یا عدم وجود یک مقدار در Map داشته باشیم.
  • قادر باشیم مقدار متناظر با یک کلید را تغییر دهیم.
  • قادر باشیم تمام اعضای Map را لیست کنیم.

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

متد کاربرد
clear() تمام عناصر داخل Map را پاک می کند.
containsKey(Object key) بررسی می کند که آیا کلید (key) مورد نظر در Map وجود دارد یا خیر؟
containsValue(Object val) بررسی می کند که آیا مقدار مورد نظر در Map وجود دارد یا خیر؟
entrySet() تمام زوج های کلید-مقدار را در داخل یک Set به ما ارائه می دهد.
equals(Object obj) تساوی این Map با Map دیگری را بررسی می کند.
get(Object key) مقدار متناظر با یک کلید (key) را بر می گرداند.
hashCode() HashCode کل Map را محاسبه می کند.
isEmpty() بررسی می کند که Map خالی است یا خیر؟
keySet() تمام کلید ها را در داخل یک در اختیار ما قرار می دهد.
put(Object key,Object val) یک زوج کلید-مقدار را در Map قرار می دهد.
putAll(Map m) تمام عناصر یک Map دیگر را به Map فعلی اضافه می کند.
remove(Object key) یک کلید (key) را حذف می کند که این عمل باعث حذف مقدار متناظر با آن نیز می شود.
size() تعداد کلید های موجود را بر می گرداند.
Collection values() یک Collection از روی مقادیر ایجاد کرده و بر می گرداند.

Map.Entry

Map.Entry یک interface برای دسترسی به زوج کلید-مقدار (entry) است که متد هایی را برای استخراج کلید یا مقدار در اختیار ما قرار می دهد. متد های Map.Entry عبارتند از :

متد کاربرد
equals(Object o) تصاوی یک entry را با entry دیگری بررسی می کند.
getKey() از داخل یک زوج کلید-مقدار ، کلید را استخراج می کند.
getValue() از داخل یک زوج کلید-مقدار ، مقدار را استخراج می کند.
hashCode() HashCode متناظر با entry را محاسبه می کند.
setValue(Object o) به کلید فعلی یک مقدار جدید نسبت می دهد.

در ادامه با دو مثال با Map آشنا می شویم و مثال های بیشتر را به آموزش های بعدی موکول می کنیم. در مثال اول یک Map به صورت زوج های نام-نمره ایجاد می کنیم که در آن کلید نام افراد و مقدار نمره آن هاست.

import java.util.HashMap;
import java.util.Map;

public class MapDemo
{
    public static main(String[] args)
    {
        Map myMap = new HashMap<>();

        myMap.put("Jenny", 85);
        myMap.put("Jenny", 87);
        myMap.put("Peter", "No Score");
        myMap.put("Mary Jane", 64);
        myMap.put("Azhar", 87);

        System.out.println(myMap);
    }
}
{Azhar=79, Jenny=87, Mary Jane=64, Peter=No Score}

در مثال بالا ابتدا یک شی از Map ایجاد کردیم ، چون Map تنها یک interface است برای استفاده از new و ساخت یک شی واقعی باید از یکی از زیر کلاس های آن استفاده کنیم که در اینجا از HashMap که بعداً با آشنا می شویم استفاده کردیم. پس از ساخت Map با استفاده از متد put زوج های کلید و مقدار را در Map قرار دادیم ، چون کلید نمی تواند تکراری باشد پس از فراخوانی (“Jenny”, 85) مقدار قبلی متناظر با Jenny یعنی 85 از Map پاک می شود ولی دقت کنید که مقادیر می توانند تکراری باشند (بر خلاف کلید)، به عنوان مثال Azhar و Jenny هر دو دارای مقدار 87 هستند. در مثال دوم با Map.Entry آشنا می شویم و برای سادگی بیشتر از همان کد مثال قبلی استفاده می کنیم.

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MapDemo
{
    public static main(String[] args)
    {

        Map myMap = new HashMap<>();

        myMap.put("Jenny", 87);
        myMap.put("Peter", "No Score");
        myMap.put("Mary Jane", 64);
        myMap.put("Azhar", 87);

        Set<Map.Entry> s = myMap.entrySet();

        for (Map.Entry me : s)
        {
            System.out.println("[" + me.getKey() + "]=(" + me.getValue() + ")");
        }
    }
}
[Azhar] = (79)
[Jenny] = (87)
[Mary Jane] = (64)
[Peter] = (No Score)

همانطور که مشاهده می کنید کلید ها را بین [] و مقادیر را بین () قرار می دهیم. پس از ساخت Map متد ()entryرا فراخوانی می کنیم و نیجه را در یک می ریزیم ، باید مشخص کنیم که عناصر این از نوع Map.Entry هستند. پس از آن در داخل یک حلقه for هر کدام از Map.Entry ها را استخراج می کنیم و سپس با فراخوانی متد ()getKey کلید و با فراخوانی متد getValue مقدار را به دست آورده و چاپ می کنیم.