JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ مجموعن بابت مٿي 10 سوال
FedoraLinux
سطح
Москва

جاوا ۾ مجموعن بابت مٿي 10 سوال

گروپ ۾ شايع ٿيل
مضمون مضمون جو ترجمو آهي " جاوا مجموعن بابت مٿي 10 سوال " . هيٺ جاوا ۾ مجموعن بابت سڀ کان وڌيڪ مشهور سوال آهن، Stackowerflow تي پڇيو ۽ بحث ڪيو ويو. ان کان اڳ جو توھان انھن سوالن کي ڏسو، اھو بھتر ٿيندو تہ طبقن جي ھيرارڪي ڊاگرام کي ڏسو. 1. ArrayList جي بدران LinkedList ڪڏهن استعمال ڪجي؟ هڪ ArrayList حقيقت ۾ هڪ صف آهي؛ ان جا عنصر سڌو سنئون انڊيڪس ذريعي پهچائي سگھجن ٿا. جيڪڏهن صف اوور فلو ٿئي ٿي، هڪ نئون هڪ وڌيڪ جڳهه سان ضروري آهي. سڀني عناصر کي رکڻ ۽ منتقل ڪرڻ O (n) وقت وٺندو. گڏوگڏ، عناصر کي شامل ڪرڻ ۽ ختم ڪرڻ ضروري آھي موجوده عناصر کي صف ۾ منتقل ڪرڻ لاء. اهو شايد ArrayList استعمال ڪرڻ جي سڀ کان وڏي تڪليف آهي. LinkedList عنصر لنڪ جي ٻٽي لسٽ آهي. اهڙيء طرح، مرڪز ۾ عنصر تائين رسائي حاصل ڪرڻ لاء، توهان کي چادر جي شروعات کان آخر تائين ڳولڻو پوندو. ٻئي طرف، LinkedList ۾ هڪ عنصر شامل ڪرڻ ۽ ختم ڪرڻ تيز آهي ڇو ته اهي عمل صرف فهرست پاڻ کي تبديل ڪندا آهن. بدترين وقتن جو مقابلو هيٺ ڏنل آهي:
طريقو صف بندي LinkedList
حاصل ڪريو (انڊيڪس) او (1) او (ن)
شامل ڪريو (اي) او (ن) او (1)
شامل ڪريو (اي، انڊيڪس) او (ن) او (ن)
هٽايو (انڊيڪس) او (ن) او (ن)
Iterator.remove() او (ن) او (1)
Iterator.add(E) او (ن) او (1)
هلندڙ وقت جي باوجود، ياداشت جي استعمال کي انفرادي طور تي وڏي لسٽن لاء سمجهيو وڃي. هڪ LinkedList ۾، هر نوڊ کي پوئين ۽ ايندڙ نوڊس کي ڳنڍڻ لاءِ گهٽ ۾ گهٽ ٻه اضافي پوائنٽر هجڻ گهرجن، جڏهن ته ArrayList ۾، صرف عناصر جي هڪ صف جي ضرورت هوندي آهي. ArrayList، LinkedList ۽ Vector لسٽن جو وڌيڪ مقابلو . 2. جمع ڪرڻ جي دوران عناصر کي هٽائڻ لاءِ موثر برابر، iteration دوران مجموعو کي تبديل ڪرڻ (عناصر کي هٽائڻ) جو واحد صحيح طريقو استعمال ڪرڻ آهي 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 استعمال ڪرڻ، جيڪو Apache Commons Lang لائبريري ۾ واقع آهي . int[] array = ArrayUtils.toPrimitive(list.toArray(new Integer[0])); JDK ۾ هن اظهار لاءِ ڪو شارٽ ڪٽ ناهي. ياد رکو ته توهان List.toArray() استعمال نٿا ڪري سگهو ڇو ته هي اظهار List کي Integer[] ۾ بدلائي ٿو (جيڪو ابتدائي قسم نه آهي). صحيح طريقو هيٺ ڏنل آپشن هوندو: int[] array = new int[list.size()]; for(int i=0; i < list.size(); i++) { array[i] = list.get(i); } 4. هڪ int[] array کي لسٽ ۾ ڪيئن بدلجي؟ Apache Commons Lang لائبريري ۾ ArrayUtils استعمال ڪرڻ جو آسان طريقو پڻ آهي ، جيئن مٿي. انهي سان گڏ، JDK ۾ هن اظهار لاء ڪو شارٽ کٽ ناهي. 5. جمع کي فلٽر ڪرڻ جو بهترين طريقو ڇا آهي؟ توهان استعمال ڪري سگهو ٿا ٽئين پارٽي پيڪيجز جهڙوڪ گووا يا Apache Commons Lang ڪارڪردگي وڌائڻ لاءِ. انهن ٻنهي پيڪيجز ۾ هڪ فلٽر () طريقو آهي ( گووا کان ڪليڪشن2 ڪلاس ۾ ۽ اپاچي کان ڪليڪشن يوٽيل ). filter() طريقو عنصرن کي واپس ڪندو جيڪي ڏنل پيشڪش سان ملن ٿا. JDK ۾ سڀ ڪجهه وڌيڪ پيچيده آهي. سٺي خبر اها آهي ته جاوا 8 ۾ اڳڪٿيون شامل ڪيون وينديون ، پر هاڻي توهان کي استعمال ڪرڻ جي ضرورت آهي Iterator کي سڄي مجموعي ذريعي ٻيهر ڪرڻ لاءِ. يقينن، توهان نئين Predicate انٽرفيس سان واقف ٿيڻ سان گووا ۽ اپاچي جي پيروي ڪيل رستي جي تقليد ڪري سگهو ٿا. ھاڻي اسان ڪليڪشن کي فلٽر ڪرڻ لاءِ ھيٺ ڏنل ڪوڊ استعمال ڪري سگھون ٿا: 6. لسٽ کي سيٽ ۾ آساني سان ڪيئن بدلجي؟ هي ڪرڻ جا ٻه طريقا آهن، ان تي منحصر آهي ته توهان برابري کي ڪيئن بيان ڪرڻ چاهيو ٿا. ڪوڊ جو پهريون ٽڪرو لسٽ کي HashSet ۾ رکي ٿو. هن صورت ۾ نقل خاص طور تي hashCode (). عام طور تي اهو ڪم ڪندو. پر جيڪڏهن توهان کي حساب ۾ رکڻ جي ضرورت آهي مقابلي واري رستي کي، پوء اهو بهتر ٿيندو ته ڪوڊ جو ٻيو حصو استعمال ڪيو وڃي، جتي توهان پنهنجو پاڻ جي مقابلي جي وضاحت ڪري سگهو ٿا. 7. مان هڪ ArrayList مان نقلي عنصرن کي ڪيئن ختم ڪري سگهان ٿو؟ اهو سوال ڪنهن حد تائين مٿي ڄاڻايل سوال سان لاڳاپيل آهي. جيڪڏهن ArrayList ۾ عناصر جي ترتيب توهان لاءِ ڪا اهميت نه رکي، هڪ سمارٽ قدم اهو هوندو ته شيٽ کي سيٽ ۾ رکي نقلن کي هٽائڻ لاءِ، ۽ پوءِ ان کي واپس لسٽ ۾ واپس آڻيو. هيٺ هڪ مثال آهي. جيڪڏهن عنصرن جو حڪم توهان لاءِ اهميت رکي ٿو، ته پوءِ آرڊر کي يقيني بڻائي سگهجي ٿو لسٽ ۾ رکڻ سان LinkedHashSet ، جيڪو معياري JDK ۾ آهي. 8. ترتيب ڏنل مجموعو 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 هڪ منظم قطار مهيا ڪري ٿي. 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