Map<Integer, String> map = new HashMap<>();
map.put(1, "string 1");
map.put(2, "string 2");
map.put(3, "string 3");
اور کلید کے ذریعہ اقدار حاصل کرنے کا طریقہ یہ ہے:
String string1 = map.get(1);
String string2 = map.get(2);
String string3 = map.get(3);
اگر اوپر کی تمام باتیں واضح ہیں، تو آئیے مقبول سوالات کے اپنے جوابات پر آگے بڑھتے ہیں!
0. نقشہ کی تمام اقدار کے ذریعے اعادہ کیسے کریں۔
اقدار پر اعادہ کرنا سب سے عام آپریشن ہے جو آپ نقشوں کے ساتھ انجام دیتے ہیں۔ تمام کلیدی قدر کے جوڑے اندرونی Map.Entry انٹرفیس میں محفوظ ہیں، اور انہیں حاصل کرنے کے لیے آپ کو کال کرنے کی ضرورت ہےentrySet()
۔ یہ جوڑوں کا ایک سیٹ لوٹاتا ہے جس کے ذریعے لوپ کیا جاسکتا ہے:
for(Map.Entry<Integer, String> entry: map.entrySet()) {
// get key
Integer key = entry.getKey();
// get value
String value = entry.getValue();
}
Или используя итератор:
Iterator<Map.Entry<Integer, String>> itr = map.entrySet().iterator();
while(itr.hasNext()) {
Map.Entry<Integer, String> entry = itr.next();
// get key
Integer key = entry.getKey();
// get value
String value = entry.getValue();
}
1. نقشہ کو فہرست میں تبدیل کرنے کا طریقہ
نقشہ انٹرفیس میں 3 طریقے ہیں جو عناصر کی فہرست واپس کرتے ہیں:- keySet() - چابیاں کا ایک سیٹ لوٹاتا ہے۔
- values() - اقدار کا مجموعہ لوٹاتا ہے۔
- entrySet() - کلیدی قدر کے سیٹ کا ایک سیٹ لوٹاتا ہے۔
ArrayList
، تو آپ دیکھیں گے کہ ایک کنسٹرکٹر موجود ہے جس میں قسم کلیکشن کی دلیل ہے۔ چونکہ سیٹ مجموعہ کی اولاد ہے، اس لیے مذکورہ بالا تمام طریقوں کے نتائج کلاس کے کنسٹرکٹر کو بھیجے جا سکتے ہیں ArrayList
۔ لہذا ہم نئی فہرستیں بنائیں گے اور ان کو درج ذیل اقدار سے پُر کریں گے Map
۔
// key list
List<Integer> keyList = new ArrayList<>(map.keySet());
// value list
List<String> valueList = new ArrayList<>(map.values());
// key-value list
List<Map.Entry<Integer, String>> entryList = new ArrayList<>(map.entrySet());
2. نقشہ کی چابیاں کیسے ترتیب دیں۔
نقشوں کو چھانٹنا بھی پروگرامنگ میں کافی عام کام ہے۔ آپ اسے کئی طریقوں سے کر سکتے ہیں:-
Map.Entry کو فہرست میں ڈالیں اور Comparator کا استعمال کرتے ہوئے اسے ترتیب دیں ۔
موازنہ کرنے والے میں ہم صرف جوڑوں کی چابیاں کا موازنہ کریں گے:
List
> list = new ArrayList(map.entrySet()); Collections.sort(list, new Comparator<Map.Entry<Integer, String>>() { @Override public int compare(Map.Entry<Integer, String> o1, Map.Entry<Integer, String> o2) { return o1.getKey() - o2.getKey(); } }); اگر آپ لیمبڈاس کو سمجھتے ہیں، تو اس اندراج کو نمایاں طور پر مختصر کیا جا سکتا ہے:
Collections.sort(list, Comparator.comparingInt(Map.Entry::getKey));
-
استعمال کریں
SortedMap
، یا زیادہ واضح طور پر، اس کا نفاذTreeMap
، جو اپنے کنسٹرکٹر میں Comparator کو لیتا ہے۔ یہ موازنہ نقشہ کی چابیاں پر لاگو کیا جائے گا، لہذا چابیاں ایسی کلاسیں ہونی چاہئیں جو انٹرفیس کو نافذ کرتی ہیںComparable
:SortedMap<Integer, String> sortedMap = new TreeMap<>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o1 - o2; } });
اور، یقینا، ہر چیز کو lambdas کا استعمال کرتے ہوئے دوبارہ لکھا جا سکتا ہے:
SortedMap<Integer, String> sortedMap = new TreeMap<>(Comparator.comparingInt(o -> o));
پہلے طریقہ کے برعکس، SortedMap کا استعمال کرتے ہوئے، ہم ہمیشہ ڈیٹا کو ترتیب شدہ شکل میں ذخیرہ کریں گے۔
3. نقشے کی قدروں کو کیسے ترتیب دیا جائے۔
یہاں آپ کو چابیاں کے لیے پہلے کی طرح کا طریقہ استعمال کرنا چاہیے - اقدار کی فہرست حاصل کریں اور فہرست میں ترتیب دیں:List <Map.Entry<Integer, String>> valuesList = new ArrayList(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<Integer, String>>() {
@Override
public int compare(Map.Entry<Integer, String> o1, Map.Entry<Integer, String> o2) {
return o1.getValue().compareTo(o2.getValue());
}
});
اور اس کے لیے لیمبڈا اس طرح لگتا ہے:
Collections.sort(list, Comparator.comparing(Map.Entry::getValue));
4. HashMap، TreeMap، اور Hashtable میں کیا فرق ہے۔
جیسا کہ پہلے ذکر کیا گیا ہے، نقشہ انٹرفیس کے 3 اہم نفاذ ہیں۔ ان میں سے ہر ایک کی اپنی خصوصیات ہیں:-
عناصر کی ترتیب۔
HashMap
اورHashtable
اس بات کی ضمانت نہیں دیتے کہ اشیاء کو اسی ترتیب میں ذخیرہ کیا جائے گا جسے وہ شامل کیا گیا تھا۔ اس کے علاوہ، وہ اس بات کی ضمانت نہیں دیتے کہ عناصر کی ترتیب وقت کے ساتھ تبدیل نہیں ہوگی۔ بدلے میں،TreeMap
یہ عناصر کو اس ترتیب میں ذخیرہ کرنے کی ضمانت دیتا ہے جس ترتیب سے وہ شامل کیے گئے تھے یا دیئے گئے موازنہ کے مطابق۔ -
درست اقدار۔
HashMap
آپ کو ایک کلید اور ایک کالعدم قدر رکھنے کی اجازت دیتا ہے،HashTable
نہیں۔ TreeMap صرف null اقدار کا استعمال کر سکتا ہے اگر موازنہ کرنے والا اس کی اجازت دیتا ہے۔ موازنہ کرنے والے کا استعمال کیے بغیر (جوڑوں کو اس ترتیب میں ذخیرہ کرکے جو وہ شامل کیے گئے تھے)، null کی اجازت نہیں ہے۔ -
ہم وقت سازی صرف
HashTable
مطابقت پذیر ہے، باقی نہیں ہیں. اگر مختلف تھریڈز کے ذریعے نقشہ تک رسائی حاصل نہیں کی جائے گی، تو HashTable کے بجائے HashMap استعمال کرنے کی سفارش کی جاتی ہے۔
ہیش میپ | ہیش ٹیبل | ٹری میپ | |
---|---|---|---|
عناصر کی ترتیب | نہیں | نہیں | جی ہاں |
قدر کے طور پر null | جی ہاں | نہیں | واقعی نہیں۔ |
دھاگے کی حفاظت | نہیں | جی ہاں | نہیں |
عناصر کی تلاش کی الگورتھمک پیچیدگی | O(1) | O(1) | O(log n) |
ہڈ کے نیچے ڈیٹا کا ڈھانچہ | ہیش ٹیبل | ہیش ٹیبل | سرخ سیاہ درخت |
5. دو طرفہ نقشہ کیسے بنایا جائے۔
بعض اوقات ایسا ڈیٹا ڈھانچہ استعمال کرنا ضروری ہو جاتا ہے جس میں کیز اور ویلیوز دونوں منفرد ہوں گے، یعنی نقشے میں کلید کے جوڑے ہوں گے۔ یہ ڈیٹا ڈھانچہ آپ کو نقشے پر ایک "الٹی منظر/تلاش" بنانے کی اجازت دیتا ہے۔ یعنی، ہم ایک کلید کو اس کی قدر سے تلاش کر سکتے ہیں۔ ڈیٹا کے اس ڈھانچے کو دو طرفہ نقشہ کہا جاتا ہے، جو بدقسمتی سے JDK سے تعاون یافتہ نہیں ہے۔ لیکن، خوش قسمتی سے، اس کا نفاذ اپاچی کامن کلیکشنز یا امرود کی لائبریریوں میں پایا جا سکتا ہے۔ وہاں اسے بالترتیب BidiMap اور BiMap کہا جاتا ہے۔ یہ نفاذ چابیاں اور اقدار کی انفرادیت پر پابندیاں عائد کرتے ہیں۔ اس سے ون ٹو ون تعلق پیدا ہوتا ہے۔6. خالی نقشہ کیسے بنایا جائے۔
خالی نقشہ بنانے کے دو طریقے ہیں:-
عام آبجیکٹ کا آغاز:
Map<Integer, String> emptyMap = new HashMap<>();
-
ایک ناقابل تبدیل خالی نقشہ بنانا:
Map<Integer, String> emptyMap = Collections.emptyMap();
UnsupportedOperationException
استثناء۔ اس مضمون میں، ہم نے سب سے عام سوالات کو دیکھا جو آپ کو نقشہ انٹرفیس استعمال کرتے وقت ہو سکتے ہیں۔
اور کیا پڑھنا ہے: |
---|
GO TO FULL VERSION