JavaRush /جاوا بلاگ /Random-UR /جاوا میں صفوں کے بارے میں کچھ

جاوا میں صفوں کے بارے میں کچھ

گروپ میں شائع ہوا۔
ہیلو! پہلے، تربیت کے دوران، ہم واحد اشیاء (یا قدیم اقسام) کے ساتھ کام کرتے تھے۔ لیکن کیا ہوگا اگر ہمیں ایک چیز کے ساتھ نہیں بلکہ پورے گروپ کے ساتھ کام کرنے کی ضرورت ہے؟ مثال کے طور پر، ہم اپنی کمپنی کے تمام ملازمین کی سالگرہ کی فہرست بنانا چاہتے ہیں۔ اس میں فارمیٹ میں 30 لائنیں ہونی چاہئیں: "Andrey Petrov، 25 جنوری۔" ایک خاص ڈیٹا ڈھانچہ، ایک صف، یہاں ہماری مدد کرے گی۔ اگر آپ صف کا موازنہ حقیقی زندگی کی اشیاء سے کرتے ہیں، تو اس کی ساخت سیلوں کے ساتھ بینک والٹ سے بہت ملتی جلتی ہے: جاوا میں صفوں کے بارے میں کچھ - 1صف بھی خلیات پر مشتمل ہوتی ہے۔ آپ ہر سیل میں کچھ ڈال سکتے ہیں۔ اس صورت میں، مواد تک رسائی کے لیے آپ کو سیل نمبر جاننے کی ضرورت ہے۔ صف اس طرح بنائی گئی ہے:
public class Main {

   public static void main(String[] args) {

       String [] birthdays = new String[10]; // array of Java strings

   }
}
یہاں ہم نے 10 سیلز کی ایک صف بنائی ہے۔ آپ فوری طور پر صف کی کچھ خصوصیات پر توجہ دے سکتے ہیں:
  1. یہ سختی سے بیان کردہ قسم کا ڈیٹا محفوظ کرتا ہے۔ اگر ہم نے ابتدائی طور پر ایک سٹرنگ اری بنائی ہے String، تو ہم اس میں کچھ اور ذخیرہ نہیں کر پائیں گے۔ صف بناتے وقت ڈیٹا کی قسم بتائی جاتی ہے۔ یہی چیز اسے محفوظ ڈپازٹ باکس سے ممتاز کرتی ہے، جس میں کلائنٹ جو چاہے ذخیرہ کر سکتا ہے۔
  2. ایک صف قدیم قسم کے ڈیٹا کو ذخیرہ کر سکتی ہے (مثال کے طور پر، int) سٹرنگز ( String) یا ایک ہی کلاس کی اشیاء۔ مزید واضح طور پر، خود اشیاء بھی نہیں، بلکہ ان اشیاء سے منسلک ہیں۔
  3. تخلیق کے دوران سرنی کا سائز بتانا ضروری ہے۔ آپ بعد میں اس کی وضاحت نہیں کر سکیں گے یا تخلیق کے بعد اس کا سائز تبدیل نہیں کر سکیں گے۔
[]جاوا اشارہ کرتا ہے کہ ایکسپریشن کے دونوں طرف مربع بریکٹ استعمال کرکے ایک صف بنائی جا رہی ہے ۔ ان کی وضاحت حوالہ متغیر کے نام سے پہلے یا بعد میں کی جا سکتی ہے - یہ دونوں طرح سے کام کرے گا:
//Java arrays of strings, two syntaxes
String [] birthdays = new String[10];
String birthdays [] = new String[10];
اگر آپ کسی صف میں کچھ لکھنا چاہتے ہیں، تو آپ کو سیل کا نمبر بتانا ہوگا جس میں ویلیو لکھی جائے گی۔ ارے سیل نمبر 0 سے شروع ہوتے ہیں۔ پروگرامنگ میں صفر سے شروع کرنا ایک عام عمل ہے۔ جتنی تیزی سے آپ اس کی عادت ڈالیں گے اتنا ہی بہتر :) جاوا میں صفوں کے بارے میں کچھ - 2یعنی اگر آپ صف کے پہلے سیل میں کچھ ویلیو ڈالنا چاہتے ہیں تو یہ اس طرح کیا جاتا ہے:
public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Lena Eliseeva, March 12";
   }
}
اب ہماری صف کا پہلا سیل، جو ساتھیوں کی سالگرہ پر مشتمل ہے، لینا کی سالگرہ کے ساتھ ایک تار پر مشتمل ہے۔ تشبیہ کے مطابق، آپ دوسری قدریں شامل کر سکتے ہیں:
public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Lena Eliseeva, March 12";
       birthdays[1] = "Kolya Romanov, May 18";
       birthdays[7] = "Olesya Ostapenko, January 3";
   }
}
براہ کرم نوٹ کریں: ہم نے Olesya کی سالگرہ آٹھویں سیل میں شامل کی ہے (کیا آپ بھول گئے ہیں کہ سیل نمبر 7 آٹھواں کیوں ہے؟) اگرچہ دوسرے تمام خلیات نہیں بھرے گئے ہیں۔ قدروں کو صف میں ترتیب سے لکھنا ضروری نہیں ہے - ایسی کوئی پابندی نہیں ہے۔ دوسری طرف، اگر آپ ترتیب سے لکھتے ہیں، تو آزاد اور زیر قبضہ سیلوں کی تعداد کا ٹریک رکھنا بہت آسان ہو جائے گا، اور صف میں کوئی "سوراخ" باقی نہیں رہے گا۔ اگر آپ اری سیل کے مواد کو حاصل کرنا چاہتے ہیں، جیسا کہ بینک سیل کے معاملے میں، آپ کو اس کا نمبر جاننا ہوگا۔ یہ اس طرح کیا جاتا ہے:
public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Lena Eliseeva, March 12";
       birthdays[1] = "Kolya Romanov, May 18";
       birthdays[7] = "Olesya Ostapenko, January 3";

       String olesyaBirthday = birthdays[7];
       System.out.println(olesyaBirthday);
   }
}
کنسول آؤٹ پٹ:

Олеся Остапенко, 3 января
ہم نے ایک متغیر بنایا Stringاور مرتب کرنے والے کو بتایا: "اشاریہ 7 والے سیل کو صف میں تلاش کریں birthdaysاور وہاں ذخیرہ شدہ قدر کو متغیر کو تفویض کریں String olesyaBirthday۔" اس نے بالکل ایسا ہی کیا۔

جاوا صف کی لمبائی

کسی صف کے ساتھ کام کرتے وقت، آپ ایک خاص خاصیت کا استعمال کرتے ہوئے آسانی سے اس کی لمبائی معلوم کر سکتے ہیں - length۔
public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Lena Eliseeva, March 12";
       birthdays[1] = "Kolya Romanov, May 18";
       birthdays[7] = "Olesya Ostapenko, January 3";

       int birthdaysLength = birthdays.length;
       System.out.println(birthdaysLength);
   }
}
کنسول آؤٹ پٹ:

10
نوٹ:پراپرٹی lengthصف کے سائز کو ذخیرہ کرتی ہے، نہ کہ بھرے ہوئے خلیوں کی تعداد۔ ہماری صف صرف 3 اقدار کو ذخیرہ کرتی ہے، لیکن جب ہم نے اسے بنایا، تو ہم نے اس کے لیے سائز = 10 متعین کیا۔ یہ وہ قدر ہے جو فیلڈ واپس کرتی ہے length۔ یہ کیوں مفید ہو سکتا ہے؟ ٹھیک ہے، مثال کے طور پر، اگر آپ کنسول پر تمام سالگرہ کی فہرست پرنٹ کرنا چاہتے ہیں (یہ چیک کرنے کے لیے کہ کوئی بھولا نہیں ہے)، تو آپ یہ ایک سادہ لوپ میں کر سکتے ہیں:
public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Lena Eliseeva, March 12";
       birthdays[1] = "Kolya Romanov, May 18";
       birthdays[2] = "Vika Ignatova, July 12";
       birthdays[3] = "Denis Kozlov, September 7";
       birthdays[4] = "Maxim Maslennikov, November 9";
       birthdays[5] = "Roman Baranov, August 14";
       birthdays[6] = "Valery Pyatkina, April 1";
       birthdays[7] = "Olesya Ostapenko, January 3";
       birthdays[8] = "Kostya Gurko, October 19";
       birthdays[9] = "Seryozha Naumov, May 3";

       for (int i = 0; i < birthdays.length; i++) {
           System.out.println(birthdays[i]);
       }
   }
}
لوپ میں ہم ایک متغیر بناتے ہیں iجو شروع میں صفر کے برابر ہوتا ہے۔ ہر پاس پر، ہم اپنی صف سے انڈیکس i کے ساتھ سیل لیتے ہیں اور اس کی ویلیو کو کنسول پر پرنٹ کرتے ہیں۔ لوپ 10 تکرار کرے گا، اور i کی قدریں 0 سے 9 تک بڑھ جائیں گی - بالکل ہماری صف کے خلیوں کے اشاریوں کے مطابق! birthdays[0]اس طرح ہم کنسول سے لے کر تمام ویلیو پرنٹ کریں گے birthdays[9] ۔ درحقیقت مختلف طریقے سے ارے بنانے کے طریقے ہیں۔ مثال کے طور پر، نمبروں کی ایک صف intاس طرح بنائی جا سکتی ہے:
public class Main {

   public static void main(String[] args) {
       int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
   }
}
اس طریقہ کو "تیز آغاز" کہا جاتا ہے۔ یہ کافی آسان ہے کہ ہم فوری طور پر ایک صف بناتے ہیں اور اسے قدروں سے بھر دیتے ہیں۔ صف کے سائز کو واضح طور پر بتانے کی ضرورت نہیں ہے - فوری آغاز کے دوران فیلڈ lengthخود بخود بھر جائے گی۔
public class Main {

   public static void main(String[] args) {
       int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
       System.out.println(numbers.length);
   }
}
کنسول آؤٹ پٹ:

9

جاوا آبجیکٹ سرنی

آپ نے پہلے ہی سنا ہے کہ اشیاء کی صفیں اور پرائمیٹو کی صفیں میموری میں مختلف طریقے سے محفوظ ہوتی ہیں۔ آئیے، مثال کے طور پر، تین اشیاء کی ایک صف لیتے ہیں Cat:
public class Cat {

   private String name;

   public Cat(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

       Cat[] cats = new Cat[3];
       cats[0] = new Cat("Thomas");
       cats[1] = new Cat("Hippopotamus");
       cats[2] = new Cat("Philip Markovich");
   }
}
یہاں سمجھنے کے لیے چند باتیں ہیں:
  1. پرائمیٹوز کے معاملے میں، جاوا اریز بہت سی مخصوص اقدار (جیسے نمبرز int) کو محفوظ کرتی ہیں۔ اشیاء کے معاملے میں، ایک صف بہت سے حوالہ جات کو ذخیرہ کرتی ہے. صف catsتین خلیوں پر مشتمل ہوتی ہے، جن میں سے ہر ایک میں کسی چیز کا حوالہ ہوتا ہے Cat۔ ہر لنک میموری میں ایک ایڈریس کی طرف اشارہ کرتا ہے جہاں وہ آبجیکٹ محفوظ ہے۔
  2. صف کے عناصر کو ایک ہی بلاک میں میموری میں محفوظ کیا جاتا ہے۔ یہ ان تک زیادہ موثر اور فوری رسائی کے لیے کیا جاتا ہے۔ اس طرح، لنک catsمیموری میں ایک بلاک کی طرف اشارہ کرتا ہے جہاں تمام اشیاء - صف کے عناصر - کو محفوظ کیا جاتا ہے۔ A cats[0]- اس بلاک کے اندر ایک مخصوص پتے پر۔
جاوا میں صفوں کے بارے میں کچھ - 3یہ سمجھنا ضروری ہے کہ ایک صف نہ صرف اشیاء کو ذخیرہ کر سکتی ہے، یہ خود ایک آبجیکٹ ہے۔

صفوں کی صف یا دو جہتی صف

اس کی بنیاد پر، ہمیں اس سوال کا سامنا کرنا پڑتا ہے - کیا ہم مثال کے طور پر تاروں یا نمبروں کی نہیں بلکہ صفوں کی ایک صف بنا سکتے ہیں؟ اور جواب ہوگا - ہاں، ہم کر سکتے ہیں! ایک صف اپنے اندر کسی بھی چیز کو ذخیرہ کر سکتی ہے، بشمول دیگر صفوں۔ ایسی صف کو دو جہتی کہا جائے گا۔ اگر آپ اسے کسی تصویر میں پیش کرتے ہیں، تو یہ ایک عام میز کی طرح نظر آئے گا۔ مثال کے طور پر، ہم ایک ایسی صف بنانا چاہتے ہیں جو int10 سیلوں کے ساتھ نمبروں کی 3 صفوں کو ذخیرہ کرے گی۔ یہ اس طرح نظر آئے گا: جاوا میں صفوں کے بارے میں کچھ - 4ہر لائن نمبروں کی ایک صف کی نمائندگی کرتی ہے int۔ پہلی صف میں 1 سے 10 تک کے نمبر ہوتے ہیں، دوسرا -1 سے -10 تک، تیسرا - بے ترتیب نمبروں کا ایک سیٹ۔ ان صفوں میں سے ہر ایک ہماری دو جہتی صف کے سیل میں محفوظ ہے۔ کوڈ میں دو جہتی صف کو شروع کرنا اس طرح لگتا ہے:
public static void main(String[] args) {
   Cat[][] cats = new Cat[3][5];
}
ہماری دو جہتی بلیوں کی صفوں میں سے ہر ایک میں 5 خلیات کی 3 صفیں محفوظ ہیں۔ اگر ہم اپنی آبجیکٹ کو دوسری صف کے تیسرے سیل میں رکھنا چاہتے ہیں تو ہم اسے اس طرح کرتے ہیں:
public static void main(String[] args) {
   Cat[][] cats = new Cat[3][5];
   cats[1][2] = new Cat("Fluff");
}
[1]دوسری صف کی طرف اشارہ کرتا ہے، اور [2]اس صف کے تیسرے سیل کی طرف اشارہ کرتا ہے۔ چونکہ ایک دو جہتی صف کئی صفوں پر مشتمل ہوتی ہے، اس لیے اسے عبور کرنے اور تمام اقدار کو کنسول میں پرنٹ کرنے کے لیے (یا تمام خلیات کو بھرنے کے لیے)، ہمیں ایک ڈبل، نیسٹڈ لوپ کی ضرورت ہے:
for (int i = 0; i < cats.length; i++) {
   for (int j = 0; j < cats[i].length; j++) {
       System.out.println(cats[i][j]);
   }
}
بیرونی لوپ (متغیر i) میں، ہم ان تمام اریوں کو عبور کرتے ہوئے موڑ لیتے ہیں جو ہماری دو جہتی صف کو بناتے ہیں۔ اندرونی لوپ (متغیر j) میں ہم ہر صف کے تمام خلیات کے ذریعے اعادہ کرتے ہیں۔ نتیجے کے طور پر، آبجیکٹ cats[0][0](پہلی صف، پہلا سیل) سب سے پہلے کنسول پر دکھایا جائے گا، اور دوسرا آبجیکٹ cats[0][1](پہلی صف، دوسرا سیل) ہو گا۔ جب پہلی صف ختم ہو جائے گی، , cats[1][0]اور cats[1][1]اسی cats[1][2]طرح آؤٹ پٹ ہو گی۔ ویسے، تیز ابتداء دو جہتی صفوں کے لیے بھی دستیاب ہے:
int[][] numbers = {{1,2,3}, {4,5,6}, {7,8,9}};
عام طور پر، ہم ایک دو جہتی صف کو numbersبطور لکھیں گے int[3][3]، لیکن یہ طریقہ ہمیں فوری طور پر اقدار کی وضاحت کرنے کی اجازت دیتا ہے۔ دو جہتی صف کی ضرورت کیوں ہو سکتی ہے؟ ٹھیک ہے، مثال کے طور پر، اس کی مدد سے آپ مشہور گیم "بیٹل شپ" کو آسانی سے دوبارہ بنا سکتے ہیں: جاوا میں صفوں کے بارے میں کچھ - 5"بیٹل شپ" میں کھیل کے میدان کی ساخت ایسی ہے کہ اسے آسانی سے بیان کیا جا سکتا ہے: 10 صفوں کی دو جہتی صف، ہر ایک میں 10 سیل۔ . آپ دو ایسی صفیں بناتے ہیں - اپنے اور اپنے مخالف کے لیے:
int [][] seaBattle = new int[10][10];
int [][] seaBattle2 = new int[10][10];
آپ کچھ قدروں (مثال کے طور پر نمبرز یا علامات *) کے ساتھ ان سیلز کو بھرتے ہیں جن میں آپ کے جہاز واقع ہیں، اور پھر آپ اور آپ کے مخالف سیل نمبروں کو کال کرتے ہوئے موڑ لیتے ہیں:
  • سمندری جنگ[6][5]!
  • ماضی! seaBattle2[6][6]!
  • زخمی!
  • seaBattle2[6][7]!
  • زخمی!
  • seaBattle2[6][8]!،
  • مارا گیا!

صفوں کے بارے میں اضافی وسائل

arrays کے بارے میں مزید جاننا چاہتے ہیں؟ براہ کرم ذیل کے مضامین پر ایک نظر ڈالیں۔ اس موضوع پر کافی دلچسپ اور مفید معلومات موجود ہیں۔
  1. جاوا میں Arrays - arrays، ان کی تخلیق، ابتدا اور استعمال کے بارے میں ایک تفصیلی مضمون۔ مثالوں کے ساتھ۔
  2. Arrays کلاس اور اس کا استعمال - مضمون کلاس کے کچھ طریقے بیان کرتا ہے۔Array
  3. Arrays پہلا JavaRush لیکچر ہے جو arrays کے لیے وقف ہے۔
  4. کثیر جہتی صفوں - مثالوں کے ساتھ کثیر جہتی صفوں کے بارے میں ایک تفصیلی مضمون۔
  5. صفر کی لمبائی والی صف واپس کریں، null نہیں - موثر پروگرامنگ مصنف جوشوا بلوچ خالی صفوں کو بہتر طریقے سے واپس کرنے کے طریقہ کے بارے میں بات کرتے ہیں۔
یہ صفوں کے ساتھ ہماری پہلی واقفیت کا اختتام کرتا ہے، لیکن یہ ان کے ساتھ تعامل کا صرف آغاز ہے۔ مندرجہ ذیل لیکچرز میں ہم ان کو استعمال کرنے کے دلچسپ طریقے دیکھیں گے، اور یہ بھی جانیں گے کہ جاوا کے پاس اس ڈیٹا ڈھانچے کے ساتھ زیادہ آسان کام کرنے کے لیے کیا بلٹ ان فنکشنز ہیں :)
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION