CodeGym /جاوا بلاگ /Random-UR /HashMap: یہ کس قسم کا نقشہ ہے؟
John Squirrels
سطح
San Francisco

HashMap: یہ کس قسم کا نقشہ ہے؟

گروپ میں شائع ہوا۔
ہائے! اس سبق میں، ہم Java HashMap پر ایک قریبی جائزہ لیں گے ۔ اس سے پہلے، ہم نے ڈیٹا ڈھانچے کا مطالعہ کیا ہے جہاں عناصر اپنے طور پر محفوظ ہوتے ہیں۔ ایک صف یا ایک ArrayList / LinkedList میں ، ہم کچھ عناصر کو ذخیرہ کرتے ہیں۔ لیکن کیا ہوگا اگر ہمارا کام تھوڑا سا بدل جائے؟
HashMap: یہ کس قسم کا نقشہ ہے؟  - 1
مندرجہ ذیل کام کا تصور کریں: 100 لوگوں کی ایک فہرست بنائیں جس میں ہر شخص کا نام اور پاسپورٹ نمبر محفوظ ہو۔ اصولی طور پر، یہ اتنا مشکل نہیں ہے۔ مثال کے طور پر، آپ دونوں کو سٹرنگ میں بھر سکتے ہیں، اور پھر ان تاروں کی ایک فہرست بنا سکتے ہیں: "امیلیا ایگیولر، 4211 717171"۔ لیکن اس حل میں دو خرابیاں ہیں۔ سب سے پہلے، ہمیں پاسپورٹ نمبر کے ذریعے تلاش کرنے کی اہلیت کی ضرورت ہو سکتی ہے۔ اور معلومات کو ذخیرہ کرنے کے اس فارمیٹ کے پیش نظر یہ مسئلہ ہو گا۔ دوسرا، ہمیں ایک ہی پاسپورٹ نمبر کے ساتھ دو مختلف افراد بنانے سے کوئی چیز نہیں روکتی۔ اور یہ ہمارے حل کی سب سے سنگین کمی ہے۔ اس کی ہرگز اجازت نہیں دی جانی چاہئے: کسی بھی دو لوگوں کا پاسپورٹ نمبر ایک جیسا نہیں ہے۔ ڈیٹا کا ایک نیا ڈھانچہ ہماری مدد کے لیے آتا ہے: نقشہ ۔ اسے ایک "ایسوسی ایٹو سرنی" کے نام سے بھی جانا جاتا ہے، لیکن یہ اصطلاح کبھی کبھار استعمال ہوتی ہے۔ عام طور پر اسے "لغت" یا "نقشہ" کہا جاتا ہے۔ :) یہ بنیادی طور پر ان ڈیٹا ڈھانچے سے کیسے مختلف ہے جن پر ہم نے پہلے غور کیا ہے؟ سب سے بڑھ کر، حقیقت یہ ہے کہ نقشے میں ڈیٹا کو کلیدی قدر کے جوڑوں کے طور پر محفوظ کیا جاتا ہے۔ کوئی بھی چیز کلیدوں اور قدروں کے طور پر کام کر سکتی ہے: نمبرز، سٹرنگز، یا دوسری کلاسوں کی اشیاء۔ آج ہم نقشہ کلاس کے سب سے عام نفاذ کا مطالعہ کریں گے : Java HashMap ۔ HashMap: یہ کس قسم کا نقشہ ہے؟  - 2

تو، ہمیں جاوا میں HashMap کے بارے میں کیا جاننے کی ضرورت ہے؟

یہ بنانا بہت آسان ہے:
public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();
}
یہاں ہم ایک لغت بناتے ہیں جو عناصر کو "number-string" جوڑوں کے طور پر محفوظ کرتی ہے۔ نمبر کلید کے طور پر کام کرے گا، اور سٹرنگ قدر کے طور پر۔ اس کے علاوہ ہم کلیدی قسم (انٹیجر) اور ویلیو ٹائپ (String) کی وضاحت کرتے ہیں۔ کیوں؟ سب سے پہلے، HashMap کلید ہمیشہ منفرد ہوتی ہے۔ یہ ہم پر بالکل مناسب ہے، کیونکہ ہم پاسپورٹ نمبر کو کلید کے طور پر استعمال کر سکتے ہیں اور نقل سے بچ سکتے ہیں۔ قدر پورے نام کے ساتھ ایک تار ہو گی (مختلف لوگوں کا ایک ہی نام ہو سکتا ہے؛ اس کے بارے میں ہمیں فکر کرنے کی کوئی بات نہیں ہے)۔ HashMap میں ایک نیا جوڑا شامل کرنا اس طرح لگتا ہے:
public class Main {

   public static void main(String[] args) {
       HashMap<Integer, String> passportsAndNames = new HashMap<>();

       passportsAndNames.put (212133, "Bridget Logan");
       passportsAndNames.put (162348, "Ivan the Great");
       passportsAndNames.put(8082771, "Donald John Trump");
       System.out.println(passportsAndNames);
   }
}
ہم اس کے لیے طریقہ put() استعمال کرتے ہیں۔ اس کے علاوہ، HashMap toString() طریقہ کو اوور رائیڈ کرتا ہے ، لہذا اسے کنسول پر دکھایا جا سکتا ہے۔ آؤٹ پٹ اس طرح نظر آئے گا: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Ivan the Great} اب آئیے اس بات کی تصدیق کرتے ہیں کہ کیا کیز واقعی منفرد ہیں؟ آئیے ایک کلید کے ساتھ ایک نیا عنصر شامل کرنے کی کوشش کریں جو نقشے میں پہلے ہی استعمال ہو چکی ہے:
public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");
   passportsAndNames.put(162348, "Albert Kent");// This key has already been used
   System.out.println(passportsAndNames);
}
آؤٹ پٹ: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Albert Kent} جیسا کہ آپ دیکھ سکتے ہیں، کلید 162348 سے وابستہ پچھلی قدر کو اوور رائٹ کر دیا گیا تھا۔ ہم ایک وجہ کے لیے "کلید" کی اصطلاح استعمال کرتے ہیں۔ HashMap میں موجود اقدار تک کلید کا استعمال کرتے ہوئے رسائی حاصل کی جاتی ہے، لیکن دوسری طرف نہیں۔ کلید کو قدر کا استعمال کرتے ہوئے حاصل نہیں کیا جا سکتا، کیونکہ اقدار منفرد نہیں ہو سکتی ہیں۔ HashMap سے کسی عنصر کو حاصل کرتے یا ہٹاتے وقت یہ واضح طور پر دیکھا جا سکتا ہے :
public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   String lidiaName = passportsAndNames.get(212133);
   System.out.println(lidiaName);

   passportsAndNames.remove(162348);
   System.out.println(passportsAndNames);
}
کوئی ویلیو حاصل کرنے یا ڈکشنری سے جوڑے کو ہٹانے کے لیے، ہمیں get() کو پاس کرنا چاہیے اور قدر سے مماثل منفرد کلید کو ہٹانا چاہیے ۔ صفوں اور فہرستوں کے برعکس، جاوا میں HashMap میں کوئی عددی اشاریہ نہیں ہوتا: کلید کا استعمال کرتے ہوئے قدروں تک رسائی حاصل کی جاتی ہے۔ کنسول آؤٹ پٹ: Bridget Logan {212133=Bridget Logan, 8082771=Donald John Trump} ArrayList اور LinkedList کلاسز ہمیں چیک کرنے دیں کہ آیا فہرست میں کوئی خاص عنصر موجود ہے ۔ Java HashMap ہمیں ایسا کرنے دیتا ہے۔ مزید یہ کہ ہم جوڑے کے دونوں اراکین کے لیے یہ کر سکتے ہیں: یہ وہی ہے جس کے لیے containsKey() (ایک کلید کی جانچ پڑتال کرتا ہے) اور containsValue() (ایک قدر کی جانچ پڑتال) کے طریقے ہیں۔
public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   System.out.println(passportsAndNames.containsKey(11111));
   System.out.println(passportsAndNames.containsValue("Donald John Trump"));
}
آؤٹ پٹ: غلط سچ جاوا میں HashMap کی ایک اور آسان خصوصیت یہ ہے کہ آپ تمام کلیدوں اور تمام اقدار کی الگ الگ فہرستیں حاصل کر سکتے ہیں۔ یہ keySet() اور values() طریقوں سے پورا ہوتا ہے:
public class Main {

   public static void main(String[] args) {
       HashMap<Integer, String> passportsAndNames = new HashMap<>();

       passportsAndNames.put (212133, "Bridget Logan");
       passportsAndNames.put (162348, "Ivan the Great");
       passportsAndNames.put(8082771, "Donald John Trump");

       Set keys = passportsAndNames.keySet();
       System.out.println("Keys: " + keys);

       ArrayList<String> values = new ArrayList<>(passportsAndNames.values());
       System.out.println("Values: " + values);
   }
}
چابیاں ایک سیٹ میں نکالی جاتی ہیں ، جسے ہم نے ابھی تک کور نہیں کیا ہے۔ یہ خاص بات ہے کہ اس میں دہرائے جانے والے عناصر شامل نہیں ہو سکتے۔ اب اہم بات یہ یاد رکھنے کی ہے کہ تمام کلیدوں کی فہرست کو HashMap سے علیحدہ مجموعہ میں دوبارہ حاصل کیا جا سکتا ہے۔ مثال میں، ہم نے قدروں کو ایک عام ArrayList میں محفوظ کیا ۔ کنسول آؤٹ پٹ: کیز: [212133, 8082771, 162348] اقدار: [برجٹ لوگن، ڈونلڈ جان ٹرمپ، آئیون دی گریٹ] سائز () اور صاف () طریقے بالکل وہی کام کرتے ہیں جیسا کہ پچھلے ڈھانچے میں ہم نے بحث کی ہے: پہلا لغت میں موجود عناصر کی تعداد لوٹاتا ہے، دوسرا تمام عناصر کو ہٹاتا ہے۔
public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   System.out.println(passportsAndNames.size());
   passportsAndNames.clear();
   System.out.println(passportsAndNames);
}
آؤٹ پٹ: 3 {} یہ چیک کرنے کے لیے کہ آیا ہمارے HashMap میں کم از کم ایک عنصر موجود ہے ، ہم isEmpty() طریقہ استعمال کر سکتے ہیں:
public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   if (!passportsAndNames.isEmpty()) {

       System.out.println(passportsAndNames);
   }
}
آؤٹ پٹ: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Ivan the Great} اب ہم صرف ابتدائی جانچ کے بعد کنسول میں آؤٹ پٹ کریں گے۔ :) ایک اور دلچسپ نکتہ یہ ہے کہ دو نقشوں کو ایک میں ملایا جا سکتا ہے۔ یہ putAll() طریقہ استعمال کرتے ہوئے پورا ہوا۔ ہم اسے پہلے HashMap پر کہتے ہیں، دوسری کو بطور دلیل پاس کرتے ہیں، اور دوسرے سے عناصر پہلے میں شامل کیے جاتے ہیں:
public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();
   HashMap<Integer, String> passportsAndNames2 = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   passportsAndNames2.put(917352, "Clifford Patrick");
   passportsAndNames2.put(925648, "Mitchell Salgado");

   passportsAndNames.putAll(passportsAndNames2);
   System.out.println(passportsAndNames);
}
آؤٹ پٹ: {917352=Clifford Patrick, 212133=Bridget Logan, 8082771=Donald John Trump, 925648=Mitchell Salgado, 162348=Ivan the Great} پاسپورٹ اور نام 2 میں موجود تمام جوڑوں کو پاسپورٹ کے نام پر کاپی کیا گیا ہے ۔ اب ایک زیادہ پیچیدہ مثال پر غور کریں۔ خاص طور پر، ایک لوپ میں ایک HashMap پر تکرار .
for (Map.Entry<Integer, String> entry: passportsAndNames.entrySet()) {
   System.out.println(entry);
}
Map.Entry کلاس لغت کے اندر کلیدی قدر کے جوڑے کو ظاہر کرتی ہے ۔ entrySet () طریقہ ہمارے HashMap میں تمام جوڑوں کی فہرست لوٹاتا ہے ۔ چونکہ ہمارا نقشہ ان Map.Entry جوڑوں پر مشتمل ہے، اس لیے ہم جوڑوں پر اعادہ کر رہے ہیں، علیحدہ کلیدیں یا اقدار نہیں۔ آؤٹ پٹ: 212133=Bridget Logan 8082771=Donald John Trump 162348=Ivan the Great کے علاوہ، HashMap کے لیے آفیشل اوریکل دستاویزات کا مطالعہ کرنا نہ بھولیں ۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION