جاوا میں فہرست کو تبدیل کرنا - جگہ جگہ اور باہر کی جگہ

اس مختصر ٹیوٹوریل میں، آپ سیکھیں گے کہ جاوا میں جگہ جگہ اور باہر کی فہرست کو کیسے تبدیل کیا جائے۔

جگہ جگہ اور باہر کی جگہ کو تبدیل کرنا

فہرستوں پر کارروائیاں کرتے وقت - آپ اس بات پر غور کرنا چاہیں گے کہ کیا کارروائیاں جگہ جگہ کی گئی ہیں (اصل چیز پر تبدیلیاں کی گئی ہیں)، یا آیا وہ جگہ سے باہر ہیں (تبدیلیاں ایک کاپی پر نافذ کی گئی ہیں، اور اصل اعتراض غیر تبدیل شدہ ہے)۔

کچھ زبانیں اور لائبریریاں مختلف ڈیفالٹ طرز عمل کو ترجیح دیتی ہیں۔ جاوا میں، فہرستوں کو تبدیل کرنے پر زیادہ تر کارروائیاں ہوں گی۔ جگہ.

اگر یہ آپ کا مطلوبہ سلوک ہے - بہت اچھا! اگر نہیں، تو آپ کاپی کو ریورس کرنے سے پہلے فہرست کی ایک کاپی بنانا چاہیں گے:

List list = new ArrayList(Arrays.asList(1, 2, 3));
List listCopy = new ArrayList(list);

نوٹ: ۔ clone() طریقہ نہیں کرتا ایک گہری کاپی بنائیں. کا استعمال کرتے ہوئے فہرست بنانا new ArrayList(list) نہیں کرتا ایک گہری کاپی بنائیں. گہری کاپیاں بنانے کی حوصلہ شکنی کی جاتی ہے، اور حیرت انگیز طور پر عام طریقے سے کرنا مشکل ہے (اور کچھ معاملات میں، فہرست میں موجود ڈیٹا کی قسموں پر منحصر ہے)۔ یہ آپ کو ریورس کرنے کے قابل ہونے سے نہیں روکے گا۔ list اور نوٹ کے عناصر ہیں listCopy الٹ کیا جا رہا ہے، اگرچہ.

Collections.reverse()

۔ Collections.reverse() طریقہ مجموعہ کو ریورس کرنے کا معیاری طریقہ ہے، اور "گمشدہ" کے طور پر کام کرتا ہے List.reverse() طریقہ یہ جگہ جگہ فہرست کو الٹ دیتا ہے:

List list = new ArrayList(Arrays.asList(1, 2, 3));
List listCopy = new ArrayList(list);

Collections.reverse(list);

System.out.println(list);     
System.out.println(listCopy); 

امرود کی فہرستیں (فہرست)

اگر آپ اپنے پروجیکٹ میں پہلے سے ہی گوگل امرود استعمال کر رہے ہیں، تو آپ اس کا فائدہ بھی اٹھا سکتے ہیں۔ Lists کلاس، جو پیش کرتا ہے reverse() طریقہ، جو اصل فہرست کو جگہ جگہ ترتیب نہیں دیتا، لیکن ایک کاپی بناتا ہے اور کاپی کو الٹ دیتا ہے:

List list = new ArrayList(Arrays.asList(1, 2, 3));
List reversedList = Lists.reverse(list);

System.out.println(list);         
System.out.println(reversedList); 

اگر آپ کے پاس یہ پہلے سے موجود نہیں ہے، تو آپ Maven کا استعمال کرتے ہوئے اپنے پروجیکٹ میں Google Guava کو شامل کر سکتے ہیں، اس کا انحصار اپنے pom.xml فائل:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
</dependency>

یا گریڈل کے ذریعے:

implementation group: 'com.google.guava', name: 'guava'

نوٹ: اگر آپ کے پاس پہلے سے گوگل امرود نہیں ہے، یا آپ اسے اپنے پروجیکٹ کے دوسرے حصوں کے لیے استعمال کرنے کا ارادہ نہیں رکھتے ہیں تو اسے صرف اس آپریشن کے لیے درآمد نہ کریں، اور اس پر قائم رہیں۔ Collections.reverse() طریقہ امرود ایک بہت بڑا انحصار ہے، اور یہ ایک بڑی حد سے زیادہ حد ہے اسے صرف اس آپریشن کے لیے استعمال کریں۔

List.add() اور List.remove()

اگر آپ فہرست کو تبدیل کرنے کے علاوہ اضافی کارروائیاں کرنا چاہتے ہیں تو - آپ اصل فہرست کے ذریعے اعادہ کر سکتے ہیں، عناصر کو آخر سے ہٹا سکتے ہیں، انہیں صوابدیدی طریقہ سے پاس کر سکتے ہیں، اور فہرست کے آغاز میں انہیں دوبارہ شامل کر سکتے ہیں:


public static int process(int input) {
    return input;
}

List list = new ArrayList(Arrays.asList(1, 2, 3));

for (int i = 0, j = list.size()-1; i <= j; i++) {
    int lastValue = process(list.remove(j));
    list.add(i, lastValue);
}

System.out.println(list);  

معیار

تو، سب سے تیز کون سا ہے؟ یہ اس بات پر بھی منحصر ہے کہ آیا آپ آپریشن کو جگہ پر کرنا چاہتے ہیں یا باہر۔

ان پلیس ریورسل بینچ مارک

آئیے تینوں طریقوں پر دونوں طریقوں کو بینچ مارک کرتے ہیں، جگہ سے باہر سے شروع کرتے ہوئے:

List list = new Random().ints(100, 1, 11)
                .boxed()
                .collect(Collectors.toList());

int runs = 1000;

long start1 = System.currentTimeMillis();
for (int i = 0; i < runs; i++) {
    reverseListCollections(list);
}
long end1 = System.currentTimeMillis();
System.out.println(String.format("Collections.reverse() took: %s miliseconds", end1-start1));

long start2 = System.currentTimeMillis();
for (int i = 0; i < runs; i++) {
    reverseListGuava(list);
}
long end2 = System.currentTimeMillis();
System.out.println(String.format("Guava's Lists.reverse() took: %s miliseconds", end2-start2));

long start3 = System.currentTimeMillis();
for (int i = 0; i < runs; i++) {
    reverseListManually(list);
}
long end3 = System.currentTimeMillis();
System.out.println(String.format("Manually took: %s miliseconds", end3-start3));

System.out.println("Original list: " + list);

اس کے نتائج:

Collections.reverse() took: 3 miliseconds
Guava's Lists.reverse() took: 4 miliseconds
Manually took: 13 miliseconds
Original list: [6, 7, 9, 7, 2, 5, 4, 1, 3, 2, 2, 6, ...

بہترین طرز عمل، صنعت کے لیے منظور شدہ معیارات، اور چیٹ شیٹ کے ساتھ Git سیکھنے کے لیے ہمارے ہینڈ آن، عملی گائیڈ کو دیکھیں۔ گوگلنگ گٹ کمانڈز کو روکیں اور اصل میں سیکھ یہ!

جب ہم عناصر کی تعداد کو 100 سے 1000 تک بڑھاتے ہیں تو کیا ہوتا ہے؟

Collections.reverse() took: 9 miliseconds
Guava's Lists.reverse() took: 4 miliseconds
Manually took: 133 miliseconds
Original list: [10, 2, 2, 6, 2, 4, 7, 3, 9, 2, 7, 5, ...

امرود نے 4ms کا نشان برقرار رکھا! دستی نقطہ نظر میں بدترین وقت کی پیچیدگی ہے، اور یہ لکیری طور پر بڑھ گیا ہے۔ Collections.reverse() اسکیلنگ اپ سے کم تکلیف ہوتی ہے، لیکن امرود کے نفاذ کا سب سے کم نقصان ہوتا ہے۔ اگرچہ، ذہن میں رکھیں کہ ہم امرود کے نقطہ نظر کے لیے فہرست کو دستی طور پر کاپی نہیں کرتے ہیں۔ کیا بینچ مارک بدل جائے گا جب ہم "اصل" اور "الٹ" فہرست رکھنے کے خیال کو چھوڑ دیں گے؟

آؤٹ آف پلیس ریورسل بینچ مارک

1000 عناصر کے ساتھ، اور ہر ایک فہرست کی ایک غیر الٹ کاپی پر کام کرتا ہے (جسے وقت کی پیمائش سے خارج کر دیا گیا تھا)، جب ہم ہر طریقہ سے دستی کاپی کو ہٹاتے ہیں اور کوڈ کو دوبارہ چلاتے ہیں:

Collections.reverse() took: 7 miliseconds
Guava's Lists.reverse() took: 3 miliseconds
Manually took: 131 miliseconds
Original list: [6, 8, 10, 7, 3, 8, 7, 1, 1, 9, 5, ...

امرود اب بھی مستقل طور پر دونوں کو پیچھے چھوڑنے کا انتظام کرتا ہے۔ Collections.reverse() اور دستی نقطہ نظر.

نتیجہ

اس مختصر گائیڈ میں، آپ نے سیکھا ہے کہ جاوا میں فہرست کو کس طرح تبدیل کرنا ہے، جگہ جگہ اور باہر، آپریشن سے اصل فہرست کو محفوظ کرنا۔ ہم نے استعمال کیا ہے Collections.reverse() طریقہ، گوگل امرود کا Lists.reverse() طریقہ اور ایک دستی نقطہ نظر.

ٹائم اسٹیمپ:

سے زیادہ Stackabuse