JavaRush /جاوا بلاگ /Random-UR /جاوا میں HashMap - یہ کس قسم کا نقشہ ہے؟

جاوا میں HashMap - یہ کس قسم کا نقشہ ہے؟

گروپ میں شائع ہوا۔
ہیلو! آج ہم ایک اور ڈیٹا ڈھانچے کے بارے میں بات کریں گے - نقشہ۔ اس کا باضابطہ روسی نام "ایسوسی ایٹو سرنی" ہے، لیکن یہ اکثر استعمال نہیں ہوتا ہے۔ زیادہ عام اختیارات ہیں "لغت"، "نقشہ"، یا (اکثر) بول چال انگریزی زبان "نقشہ" :) نقشہ کے اندر، ڈیٹا کو "کلید" - "قدر" کی شکل میں، یعنی جوڑوں میں محفوظ کیا جاتا ہے۔ دونوں کلیدیں اور قدریں کوئی بھی آبجیکٹ ہو سکتی ہیں—نمبرز، سٹرنگز، یا دوسری کلاسز کی اشیاء۔

نقشہ دوسرے ڈیٹا ڈھانچے سے کیسے مختلف ہے۔

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

جاوا میں ہیش میپ بنانا اور کلاس کے ساتھ کام کرنا

اس عمل کو تخلیق کرنا بہت آسان ہے:
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

}
یہاں ہم نے ایک لغت بنائی ہے جس میں عناصر کو "number-string" فارمیٹ میں محفوظ کیا جائے گا۔ نمبر کلید ہو گا، اور سٹرنگ قدر ہو گی۔ ہم نے یہ بھی بتایا کہ ہمارے پاس کس قسم کی چابیاں ہوں گی ( Integer) اور کس قسم کی اقدار ( String)۔ ایسا کیوں ہے؟ سب سے پہلے، HashMap میں کلید ہمیشہ منفرد ہوتی ہے ۔ یہ ہمارے لیے بہت اچھا کام کرے گا کیونکہ ہم پاسپورٹ نمبر کو کلید کے طور پر استعمال کر سکتے ہیں اور نقل سے بچ سکتے ہیں۔ اور پورے نام کے ساتھ لائن ایک قدر کے طور پر کام کرے گی (مختلف لوگوں کا پورا نام آسانی سے دہرایا جا سکتا ہے، ہمارے لیے اس میں کوئی حرج نہیں ہے)۔

HashMap میں ایک نیا جوڑا شامل کرنا

یہ کام اس طرح لگتا ہے:
public class Main {

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


       passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
       passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
       passportsAndNames.put(8082771, "Donald John Trump");
       System.out.println(passportsAndNames);

   }

}
اس کے لیے طریقہ استعمال کیا جاتا ہے put()۔ مزید برآں، HashMap میں ایک اوور رائڈ طریقہ ہے toString()لہذا اسے کنسول پر پرنٹ کیا جا سکتا ہے۔ آؤٹ پٹ اس طرح نظر آئے گا: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=Ivan Mikhailovich Serebryakov}

ہیش میپ کیز کی خصوصیات

اب آئیے چیک کریں کہ کیا چابیاں واقعی منفرد ہیں؟ آئیے نقشے میں پہلے سے موجود کلید کے ساتھ ایک نیا عنصر شامل کرنے کی کوشش کریں:
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");
   passportsAndNames.put(162348, "Viktor Mikhailovich Stychkin");//repeat key

   System.out.println(passportsAndNames);

}
آؤٹ پٹ: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=Viktor Mikhailovich Stychkin} کلید 162348 والا پچھلا عنصر، جیسا کہ آپ دیکھ سکتے ہیں، اوور رائٹ کر دیا گیا تھا۔ "کلید" کو ایک وجہ سے کلید کہا گیا تھا۔ HashMap میں موجود اقدار تک کلید کے ذریعے رسائی حاصل کی جاتی ہے (لیکن اس کے برعکس نہیں - کلید کو قدر کے ذریعے حاصل نہیں کیا جا سکتا، کیونکہ اقدار کو ڈپلیکیٹ کیا جا سکتا ہے)۔ یہ عنصر حاصل کرنے کے ساتھ ساتھ ہیش میپ سے کسی عنصر کو ہٹانے کی مثالوں میں واضح طور پر دیکھا جاتا ہے۔
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

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


   passportsAndNames.remove(162348);
   System.out.println(passportsAndNames);

}
کوئی قدر حاصل کرنے یا لغت سے جوڑے کو حذف کرنے کے لیے، ہمیں اس قدر کے مطابق بالکل منفرد کلید کو get()طریقوں کو منتقل کرنا ہوگا۔ HashMap میں کوئی عددی اشاریہ جات نہیں ہیں، جیسا کہ صفوں یا فہرستوں میں، کلید کے ذریعے قدر تک رسائی حاصل کی جاتی ہے۔ کنسول آؤٹ پٹ: Lidiya Arkadyevna Bublikova {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump}remove()

کلید اور قدر کی موجودگی کی جانچ کرنا

ArrayList اور LinkedList کلاسز میں ، ہم چیک کر سکتے ہیں کہ آیا کسی فہرست میں کوئی خاص عنصر شامل ہے۔ HashMap آپ کو ایسا کرنے کی بھی اجازت دیتا ہے، اور جوڑے کے دونوں حصوں کے لیے: اس میں طریقے ہیں containsKey()(کسی کلید کی موجودگی کی جانچ پڑتال) اور containsValue()(کسی قدر کی موجودگی کی جانچ)۔
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   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, "Lydia Arkadievna Bublikova");
       passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
       passportsAndNames.put(8082771, "Donald John Trump");

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

       ArrayList<String> values = new ArrayList<>(passportsAndNames.values());
       System.out.println("Values: " + values);

   }

}
چابیاں مجموعہ میں نکالی جاتی ہیں Set۔ اس کی خاصیت یہ ہے کہ اس میں دہرانے والے عناصر شامل نہیں ہو سکتے۔ اب یاد رکھنے کی اہم بات یہ ہے کہ تمام کلیدوں کی فہرست کو HashMap سے نکال کر ایک الگ مجموعہ میں بنایا جا سکتا ہے۔ مثال کے طور پر، ہم نے اقدار کو معمول پر محفوظ کیا ArrayList۔ کنسول آؤٹ پٹ: کیز: [212133, 8082771, 162348] قدریں: [لیڈیا آرکاڈیونا بوبلیکووا، ڈونلڈ جان ٹرمپ، ایوان میخائیلووچ سیریبریاکوف] طریقے بالکل وہی size()کرتے ہیں clear()جیسا کہ پچھلے ڈھانچے میں ہم گزرے تھے: پہلا ایک عدد عناصر کو واپس کرتا ہے۔ موجودہ لمحے میں لغت، دوسری تمام عناصر کو حذف کر دیتی ہے۔
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   System.out.println(passportsAndNames.size());
   passportsAndNames.clear();
   System.out.println(passportsAndNames);

}
آؤٹ پٹ: 3 {} یہ چیک کرنے کے لیے کہ آیا ہمارے ہیش میپ میں کم از کم ایک عنصر ہے، ہم طریقہ استعمال کر سکتے ہیں isEmpty():
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   if (!passportsAndNames.isEmpty()) {

       System.out.println(passportsAndNames);

   }

}
آؤٹ پٹ: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=Ivan Mikhailovich Serebryakov} اب ہم ابتدائی تصدیق کے بعد ہی کنسول پر آؤٹ پٹ کریں گے :)

دو نقشوں کو ایک میں ملانا

ایک اور دلچسپ نکتہ یہ ہے کہ دو نقشوں کو ایک میں ملایا جا سکتا ہے ۔ اس کے لیے ایک طریقہ ہے putAll()۔ ہم اسے پہلے HashMap پر کہتے ہیں، دوسری کو دلیل کے طور پر پاس کریں، اور دوسرے سے عناصر پہلے میں شامل کیے جائیں گے:
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();
   HashMap<Integer, String> passportsAndNames2 = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   passportsAndNames2.put(917352, "Alexey Andreevich Ermakov");
   passportsAndNames2.put(925648, "Maxim Olegovich Arkharov");


   passportsAndNames.putAll(passportsAndNames2);
   System.out.println(passportsAndNames);

}
آؤٹ پٹ: {917352 = الیکسی اینڈریوچ ارماکوف ، 212133 = لڈیا آرکیڈی ایونہ بلبلیوکووا ، 8082771 = ڈونلڈ جان ٹرمپ ، 925648 = میکسم اولیگووچ ارکھالام ، 162348 = ایوان میہیلوچ سریئم الیمز ۔ اب ایک اور پیچیدہ مثال کو دیکھتے ہیں۔ یعنی، ایک لوپ میں HashMap پر اعادہ کریں۔
for (Map.Entry entry: passportsAndNames.entrySet()) {

   System.out.println(entry);

}
ایک انٹرفیس کا Map.Entryمطلب صرف ایک لغت کے اندر کلیدی قدر کا جوڑا ہے۔ یہ طریقہ entrySet()ہمارے ہیش میپ میں تمام جوڑوں کی فہرست لوٹاتا ہے (چونکہ ہمارا نقشہ صرف ایسے ہی انٹری جوڑوں پر مشتمل ہے، اس لیے ہم جوڑوں پر اعادہ کرتے ہیں، نہ کہ الگ الگ کیز یا اقدار)۔ نتیجہ: 212133=Lidiya Arkadyevna Bublikova 8082771=Donald John Trump 162348=Ivan Mikhailovich Serebryakov اس مضمون کو مستقبل کے لیے محفوظ کریں: https://habr.com/ru/post/128017/ اب اسے پڑھنا بہت جلدی ہے، لیکن مستقبل میں , جب آپ HashMap استعمال کرنے پر ہاتھ اٹھائیں گے، تو یہ آپ کو یہ سمجھنے میں مدد کرے گا کہ یہ ڈیٹا ڈھانچہ اندر سے کیسے کام کرتا ہے۔ نیز، HashMap پر Oracle کی آفیشل دستاویزات کو دیکھنا نہ بھولیں ۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION