JavaRush /جاوا بلاگ /Random-UR /جاوا میں مجموعوں کے بارے میں سرفہرست 10 سوالات
FedoraLinux
سطح
Москва

جاوا میں مجموعوں کے بارے میں سرفہرست 10 سوالات

گروپ میں شائع ہوا۔
یہ مضمون مضمون کا ترجمہ ہے " جاوا کلیکشن کے بارے میں سرفہرست 10 سوالات " ۔ ذیل میں جاوا میں مجموعوں کے بارے میں سب سے مشہور سوالات ہیں، جو Stackowerflow پر پوچھے گئے اور زیر بحث آئے۔ اس سے پہلے کہ آپ ان سوالات کو دیکھیں، کلاس کے درجہ بندی کے خاکے کو دیکھنا اچھا ہوگا۔ 1. ArrayList کے بجائے LinkedList کب استعمال کریں؟ ایک ArrayList درحقیقت ایک صف ہے؛ اس کے عناصر تک براہ راست انڈیکس کے ذریعے رسائی حاصل کی جا سکتی ہے۔ اگر صف اوور فلو ہوتی ہے تو، زیادہ جگہ کے ساتھ ایک نیا ضروری ہو جاتا ہے۔ تمام عناصر کو رکھنے اور منتقل کرنے میں O(n) وقت لگے گا۔ نیز، صف میں موجود عناصر کو منتقل کرنے کے لیے عناصر کو شامل کرنا اور ہٹانا ضروری ہے۔ یہ شاید ArrayList استعمال کرنے کی سب سے بڑی تکلیف ہے۔ LinkedList عنصر کے لنکس کی ایک ڈبل فہرست ہے۔ اس طرح، مرکز میں عنصر تک رسائی حاصل کرنے کے لیے، آپ کو شیٹ کے بالکل شروع سے آخر تک تلاش کرنا ہوگا۔ دوسری طرف، LinkedList میں کسی عنصر کو شامل کرنا اور ہٹانا تیز تر ہے کیونکہ یہ کارروائیاں صرف فہرست کو ہی تبدیل کرتی ہیں۔ بدترین اوقات کا موازنہ ذیل میں کیا گیا ہے:
طریقہ صفوں کی فہرست لنکڈ لسٹ
حاصل کریں (انڈیکس) O(1) O(n)
شامل کریں (E) O(n) O(1)
شامل کریں (ای، انڈیکس) O(n) O(n)
ہٹائیں (اشاریہ) O(n) O(n)
Iterator.remove() O(n) O(1)
Iterator.add(E) O(n) O(1)
چلنے کے وقت کے باوجود، بڑی فہرستوں کے لیے میموری کے استعمال پر انفرادی طور پر غور کیا جانا چاہیے۔ LinkedList میں، ہر نوڈ میں پچھلے اور اگلے نوڈس کو لنک کرنے کے لیے کم از کم دو اضافی پوائنٹرز ہونے چاہئیں، جبکہ ArrayList میں، عناصر کی صرف ایک صف کی ضرورت ہوتی ہے۔ ArrayList، LinkedList اور Vector lists کے مزید موازنہ ۔ 2. مجموعہ تکرار کے دوران عناصر کو ہٹانے کے لیے موثر مساوی تکرار کے دوران مجموعہ میں ترمیم (عناصر کو ہٹانے) کا واحد صحیح طریقہ Iterator.remove() کا استعمال کرنا ہے ۔ مثال کے طور پر: سب سے عام غلطی یہ ہے: اوپر کوڈ چلاتے وقت آپ کو ایک ConcurrentModificationException ملے گا ۔ ایسا اس لیے ہوتا ہے کیونکہ ایٹریٹر پوری فہرست میں منتقل ہونے کے لیے تیار کیا گیا تھا، لیکن اسی وقت Iterator.remove() کو کال کرکے شیٹ کو تبدیل کیا جاتا ہے۔ جیسا کہ اس استثناء کے لیے دستاویزات میں لکھا گیا ہے، Iterator itr = list.iterator(); while(itr.hasNext()) { // do something itr.remove(); } for(Integer i: list) { list.remove(i); }
"عام طور پر ایک تھریڈ کے لیے جائز نہیں ہے کہ وہ مجموعہ میں ترمیم کرے جب کہ دوسرا دھاگہ اس پر دہرا رہا ہو۔"
عام طور پر، ایک دھاگے کے لیے مجموعہ میں ترمیم کرنا ناقابل قبول ہے جبکہ دوسرا دھاگہ اس سے گزر رہا ہے۔ 3. فہرست کو int[] array میں کیسے تبدیل کیا جائے؟ ایسا کرنے کا سب سے آسان طریقہ یہ ہے کہ اپاچی کامنز لینگ لائبریری میں واقع ArrayUtils استعمال کریں ۔ JDK میں اس اظہار کے لیے کوئی شارٹ کٹ نہیں ہے۔ یاد رکھیں کہ آپ List.toArray() استعمال نہیں کر سکتے کیونکہ یہ اظہار List کو Integer[] میں تبدیل کرتا ہے (جو کہ کوئی ابتدائی قسم نہیں ہے)۔ صحیح طریقہ درج ذیل آپشن ہو گا: 4. ایک int[] array کو فہرست میں کیسے تبدیل کیا جائے؟ سب سے آسان طریقہ یہ ہے کہ اوپر کی طرح Apache Commons Lang لائبریری میں ArrayUtils استعمال کریں۔ نیز، JDK میں اس اظہار کے لیے کوئی شارٹ کٹ نہیں ہے۔ 5. مجموعہ کو فلٹر کرنے کا بہترین طریقہ کیا ہے؟ فعالیت بڑھانے کے لیے آپ تھرڈ پارٹی پیکجز جیسے امرود یا اپاچی کامنز لینگ استعمال کر سکتے ہیں۔ ان دونوں پیکجوں میں فلٹر () طریقہ ہے ( گووا سے کلیکشن 2 کلاس میں اور اپاچی سے کلیکشن یوٹیلز میں)۔ filter() طریقہ ایسے عناصر کو لوٹائے گا جو دی گئی Predicate سے ملتے ہیں۔ JDK میں سب کچھ زیادہ پیچیدہ ہے۔ اچھی خبر یہ ہے کہ جاوا 8 میں پیشین گوئیاں شامل کی جائیں گی ، لیکن ابھی آپ کو پورے مجموعہ میں تکرار کرنے کے لیے Iterator استعمال کرنے کی ضرورت ہے۔ بلاشبہ، آپ نئے Predicate انٹرفیس سے واقف ہو کر امرود اور اپاچی کے راستے کی تقلید کر سکتے ہیں۔ اب ہم مجموعہ کو فلٹر کرنے کے لیے درج ذیل کوڈ کا استعمال کر سکتے ہیں: 6. فہرست کو سیٹ میں آسانی سے کیسے تبدیل کیا جائے؟ ایسا کرنے کے دو طریقے ہیں، اس بات پر منحصر ہے کہ آپ مساوات کی تعریف کیسے کرنا چاہتے ہیں۔ کوڈ کا پہلا ٹکڑا فہرست کو ہیش سیٹ میں رکھتا ہے۔ اس معاملے میں ڈپلیکیٹ کا تعین بنیادی طور پر ہیش کوڈ () کے ذریعہ کیا جاتا ہے۔ عام طور پر یہ کام کرے گا۔ لیکن اگر آپ کو موازنہ کے راستے پر غور کرنے کی ضرورت ہے، تو بہتر ہو گا کہ کوڈ کا دوسرا حصہ استعمال کریں، جہاں آپ خود اپنے موازنہ کی وضاحت کر سکتے ہیں۔ 7. میں ArrayList سے ڈپلیکیٹ عناصر کو کیسے ہٹا سکتا ہوں؟ یہ سوال کسی حد تک اوپر کے سوال سے متعلق ہے۔ اگر ArrayList میں عناصر کی ترتیب سے آپ کو کوئی فرق نہیں پڑتا ہے تو، ایک زبردست اقدام یہ ہوگا کہ شیٹ کو ڈپلیکیٹس کو ہٹانے کے لیے سیٹ میں رکھا جائے، اور پھر اسے واپس فہرست میں واپس کر دیا جائے۔ ذیل میں ایک مثال ہے۔ اگر عناصر کی ترتیب آپ کے لیے اہمیت رکھتی ہے، تو فہرست کو LinkedHashSet میں رکھ کر آرڈر کو یقینی بنایا جا سکتا ہے ، جو معیاری JDK میں ہے۔ 8. ترتیب شدہ مجموعہ int[] array = ArrayUtils.toPrimitive(list.toArray(new Integer[0])); int[] array = new int[list.size()]; for(int i=0; i < list.size(); i++) { array[i] = list.get(i); } List list = Arrays.asList(ArrayUtils.toObject(array)); int[] array = {1,2,3,4,5}; List list = new ArrayList (); for(int i: array) { list.add(i); } Iterator itr = list.iterator(); while(itr.hasNext()) { int i = itr.next(); if (i > 5) { // filter all ints bigger than 5 itr.remove(); } } public interface Predicate { boolean test(T o); } public static void filter(Collection collection, Predicate predicate) { if ((collection != null) && (predicate != null)) { Iterator itr = collection.iterator(); while(itr.hasNext()) { T obj = itr.next(); if (!predicate.test(obj)) { itr.remove(); } } } } filter(list, new Predicate () { public boolean test(Integer i) { return i <= 5; } }); Set set = new HashSet (list); Set set = new TreeSet (aComparator); set.addAll(list); ArrayList** list = ... // initial a list with duplicate elements Set set = new HashSet (list); list.clear(); list.addAll(set); جاوا میں ترتیب شدہ مجموعہ کو سپورٹ کرنے کے کئی طریقے ہیں۔ یہ سب فطری ترتیب میں یا ایک مخصوص موازنہ کرنے والے کے ذریعہ ایک مجموعہ فراہم کرتے ہیں۔ قدرتی ترتیب کے معاملے میں، آپ کو عنصر پر موازنہ انٹرفیس کو لاگو کرنے کی بھی ضرورت ہے۔
  1. Collections.sort() ایک فہرست کو ترتیب دے سکتا ہے۔ جیسا کہ جاوا دستاویزات میں بتایا گیا ہے، یہ ترتیب مستحکم ہے اور n log(n) کارکردگی کی ضمانت دیتی ہے۔
  2. ترجیحی قطار ایک منظم قطار فراہم کرتی ہے۔ PriorityQueue اور Collections.sort() کے درمیان فرق یہ ہے کہ PriorityQueue ہر وقت قطار کی ترتیب کو برقرار رکھتی ہے، لیکن آپ صرف قطار کا پہلا عنصر حاصل کر سکتے ہیں۔ آپ PriorityQueue.get(4) جیسے عنصر تک تصادفی طور پر رسائی حاصل نہیں کر سکتے۔
  3. اگر مجموعہ میں کوئی ڈپلیکیٹس نہیں ہیں، تو آپ TreeSet کو منتخب کر سکتے ہیں ۔ PriorityQueue کی طرح، TreeSet ہر وقت ایک ترتیب شدہ سیٹ کو برقرار رکھتا ہے۔ آپ TreeSet سے سب سے چھوٹا یا سب سے بڑا عنصر حاصل کر سکتے ہیں، لیکن آپ پھر بھی عناصر تک بے ترتیب رسائی حاصل نہیں کر سکتے۔
سیدھے الفاظ میں، Collections.sort() ایک بار آرڈر کی گئی فہرست فراہم کرتا ہے۔ PriorityQueue اور TreeSet عناصر تک انڈیکسڈ رسائی کی کمی کی قیمت پر ہر وقت ترتیب شدہ مجموعہ کو برقرار رکھتے ہیں۔ 9. Collections.emptyList() یا نئی مثال یہی سوال emptyMap() اور emptySet() پر لاگو ہوتا ہے۔ دونوں طریقے ایک خالی فہرست واپس کرتے ہیں، لیکن Collections.emptyList() ایک ناقابل تغیر فہرست ہے۔ اس کا مطلب ہے کہ آپ "خالی" فہرست میں نئے عناصر شامل نہیں کر سکتے ۔ پس منظر میں، Collections.emptyList() طریقہ پر ہر کال دراصل خالی فہرست کی نئی مثال نہیں بناتی ہے۔ اس کے بجائے، یہ پہلے سے موجود خالی مثال کو دوبارہ استعمال کرے گا۔ اگر آپ سنگلٹن سے بطور ڈیزائن پیٹرن واقف ہیں ، تو آپ کو سمجھنا چاہیے کہ کیا مطلب ہے۔ اگر کثرت سے بلایا جائے تو یہ آپ کو بہتر کارکردگی دے گا۔ 10 کسی مجموعہ کو کاپی کرنا Collections.copy() کسی ماخذ کی فہرست کو منزل کی فہرست میں نقل کرنے کے دو طریقے ہیں۔ ایک طریقہ ArrayList کنسٹرکٹر کو استعمال کرنا ہے۔ دوسرا طریقہ Collections.copy() طریقہ استعمال کرنا ہے ۔ پہلی سطر پر نوٹس: ہم ایک فہرست مختص کر رہے ہیں جس کی لمبائی کم از کم اصل فہرست کی لمبائی کے برابر ہے، کیونکہ جمع کرنے کے بارے میں جاوا دستاویزات کہتی ہیں: ArrayList dstList = new ArrayList (srcList);
منزل کی فہرست کم از کم ماخذ کی فہرست جتنی لمبی ہونی چاہیے۔
جس کا مطلب ہے کہ حتمی فہرست اصل سے چھوٹی نہیں ہونی چاہیے۔ دونوں طریقے اتلی کاپی کرنے کے ہیں۔ تو ان دو طریقوں میں کیا فرق ہے؟ سب سے پہلے، Collections.copy() dstList کی جمع کرنے کی صلاحیت کو دوبارہ مختص نہیں کرے گا، یہاں تک کہ اگر dstList میں srcList کے تمام عناصر کو شامل کرنے کے لیے کافی جگہ نہ ہو۔ اس کے بجائے، یہ IndexOutOfBoundsException کو پھینک دے گا ۔ کوئی پوچھ سکتا ہے کہ کیا اس کا کوئی فائدہ ہے؟ وجہ یہ ہے کہ یہ اس بات کو یقینی بناتا ہے کہ طریقہ وقت کے ساتھ لکیری طور پر چلتا ہے۔ یہ اس وقت بھی موزوں ہے جب آپ ArrayList کنسٹرکٹر میں میموری کو دوبارہ مختص کرنے کے بجائے arrays کو دوبارہ استعمال کرنا چاہتے ہیں۔ کسی نتیجے کے بجائے اگر مضمون پڑھنے کے بعد بھی آپ کے ذہن میں سوالات ہیں تو بلا جھجھک تبصرے میں ان سے پوچھیں۔ اس کے علاوہ اگر آپ کو ترجمے میں کوئی غلطی یا کوئی اور غلطی نظر آئے تو پی ایم کو لکھیں، اسے درست کر دیا جائے گا، اور آپ کا شکریہ ادا کیا جائے گا۔ اصل ArrayList dstList = new ArrayList (srcList.size()); Collections.copy(dstList, srcList);
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION