CodeGym /جاوا بلاگ /Random-UR /صفوں کے بارے میں کچھ
John Squirrels
سطح
San Francisco

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

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

   public static void main(String[] args) {

       String [] birthdays = new String[10];

   }
}
یہاں ہم ایک صف بناتے ہیں جس میں 10 عناصر ہوتے ہیں۔ آپ فوری طور پر صف کی کچھ خصوصیات کو نوٹ کر سکتے ہیں:
  1. یہ ایک اچھی طرح سے بیان کردہ ڈیٹا کی قسم کے عناصر کو اسٹور کرتا ہے ۔ اگر ہم String array بناتے ہیں، تو ہم اس میں کچھ اور ذخیرہ نہیں کر سکتے۔ ڈیٹا کی قسم اس وقت بتائی جاتی ہے جب صف بنائی جاتی ہے ۔ یہ وہ جگہ ہے جہاں یہ سیفٹی ڈپازٹ باکس سے مختلف ہوتا ہے (جس میں ایک گاہک جو چاہے ذخیرہ کر سکتا ہے)۔

  2. جب صف بنائی جاتی ہے تو اس کا سائز بتانا ضروری ہے ۔ آپ بعد میں اس کی نشاندہی نہیں کر سکتے یا سرنی بننے کے بعد اس کا سائز تبدیل نہیں کر سکتے ۔
حقیقت یہ ہے کہ ہم ایک صف بنا رہے ہیں اظہار کے دونوں طرف مربع بریکٹ سے ظاہر ہوتا ہے۔ ان کی وضاحت حوالہ متغیر کے نام سے پہلے یا بعد میں کی جا سکتی ہے۔ کسی بھی طرح کام کرے گا:
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] = "Jana Russell, March 12";
   }
}
اب جانا کی سالگرہ ہمارے ملازمین کی سالگرہ کے پہلے سیل میں محفوظ ہے: آپ اسی طرح دیگر اقدار کو شامل کر سکتے ہیں:
public class Main {

   public static void main(String[] args) {

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

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[7] = "Rosie Mills, January 3";

       String rosieBirthday = birthdays[7];
       System.out.println(rosieBirthday);
   }
}
کنسول آؤٹ پٹ: روزی ملز، 3 جنوری ہم نے ایک متغیر بنایا اور مرتب کرنے والے کو بتایا: " برتھ ڈےString اری میں انڈیکس 7 والا باکس تلاش کریں ، اور وہاں موجود ویلیو کو متغیر روزی برتھ ڈے کو تفویض کریں ۔" اور اس نے بالکل ایسا ہی کیا۔ صفوں کے ساتھ کام کرتے وقت، ہم ایک خاص خاصیت کا استعمال کرتے ہوئے آسانی سے ان کی لمبائی تلاش کر سکتے ہیں: length ۔ String
public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[7] = "Rosie Mills, 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] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[2] = "Jeremiah Leonard, July 12";
       birthdays [3] = "Kenny Russo, September 7";
       birthdays[4] = "Tommie Barnes, November 9";
       birthdays [5] = "Roman Baranov, August 14";
       birthdays [6] = "Chanice Andersen, April 1";
       birthdays[7] = "Rosie Mills, January 3";
       birthdays [8] = "Keenan West, October 19";
       birthdays [9] = "Abraham McArthur, May 3";

       for (int i = 0; i < birthdays.length; i++) {
           System.out.println(birthdays[i]);
       }
   }
}
لوپ میں، ہم متغیر کا اعلان کرتے ہیں i، جو صفر پر شروع ہوتا ہے۔ ہر پاس پر، ہم اپنی صف سے انڈیکس i کے ساتھ عنصر حاصل کرتے ہیں اور اس کی قدر ظاہر کرتے ہیں۔ لوپ 10 تکرار کرے گا، اور میں 0 سے 9 تک بڑھ جائے گا — اور اعداد ہماری صف کے عناصر کے اشاریے ہوں گے! نتیجے کے طور پر، ہم سالگرہ[0] سے لے کر یوم پیدائش[9] تک تمام اقدار کو ظاہر کریں گے دراصل، ایک اور طریقہ ہے جس سے آپ ایک صف بنا سکتے ہیں۔ intمثال کے طور پر، آپ اس طرح s کی ایک صف بنا سکتے ہیں :
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("Behemoth");
       cats[2] = new Cat("Lionel Messi");
   }
}
آپ کو یہاں کچھ چیزوں کو سمجھنے کی ضرورت ہے:
  1. پرائمیٹوز کی صورت میں، ایک صف مخصوص قدروں کا ایک سیٹ ذخیرہ کرتی ہے (مثلاً ints)۔ اشیاء کی صورت میں، ایک صف حوالہ جات کا ایک سیٹ ذخیرہ کرتی ہے ۔
    صف catsتین عناصر پر مشتمل ہے، جن میں سے ہر ایک چیز کا حوالہ ہے۔ Catحوالہ جات میں سے ہر ایک میموری ایڈریس کی طرف اشارہ کرتا ہے جہاں متعلقہ آبجیکٹ کو محفوظ کیا جاتا ہے۔

  2. ارے عناصر کو میموری میں ایک ہی بلاک میں ترتیب دیا گیا ہے۔ ایسا اس لیے کیا جاتا ہے تاکہ ان تک جلدی اور مؤثر طریقے سے رسائی حاصل کی جا سکے۔
اس طرح، catsمیموری کے بلاک کا حوالہ دیتا ہے جہاں تمام اشیاء (سرنی عناصر) کو ذخیرہ کیا جاتا ہے. Cats[0]اس بلاک کے اندر ایک مخصوص پتے کا حوالہ دیتا ہے۔ صفوں کے بارے میں کچھ - 3 یہ سمجھنا ضروری ہے کہ ایک صف صرف اشیاء کو ذخیرہ نہیں کرتی ہے: یہ خود ایک آبجیکٹ ہے۔ یہ ہمیں اس سوال کی طرف لے جاتا ہے کہ کیا ہم نہ صرف تاروں یا نمبروں کی صفیں بنا سکتے ہیں بلکہ صفوں کی صفیں بھی بنا سکتے ہیں ۔ اور جواب ہے ہاں، ہم کر سکتے ہیں! ایک صف کسی بھی چیز کو ذخیرہ کر سکتی ہے، بشمول دیگر صفوں۔ ایسی صف کو دو جہتی کہا جاتا ہے ۔ اگر ہم اسے بصری طور پر پیش کریں تو یہ ایک عام میز کی طرح ہوگا۔ فرض کریں، ہم 3 اریوں کی ایک صف بنانا چاہتے ہیں جو ہر ایک 10 intسیکنڈ کو محفوظ کر سکے۔ یہ اس طرح نظر آئے گا:
صفوں کے بارے میں کچھ - 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("Fluffy");
}
[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) میں، ہم ہر صف کے تمام عناصر سے گزرتے ہیں۔ نتیجے کے طور پر، بلیوں[0][0] (پہلی صف، پہلا عنصر) سب سے پہلے ظاہر کیا جائے گا، اس کے بعد بلیوں [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[][] battleshipBoard1 = new int[10][10];
int[][] battleshipBoard2 = new int[10][10];
اپنے بحری جہاز کے محل وقوع کے مطابق عناصر کو آباد کرنے کے لیے کچھ قدریں (مثلاً نمبر یا علامت) استعمال کریں، اور پھر مخصوص عناصر کے لیے نقاط کو کال کرتے ہوئے موڑ لیں:
  • بیٹل شپ بورڈ1[0][2]!
  • مس! بیٹل شپ بورڈ2[2][4]!
  • مارو!
  • بیٹل شپ بورڈ2[2][5]!
  • مارو!
  • جنگی جہاز بورڈ2[2][6]!،
  • ڈوب گیا!
یہ صفوں کے ہمارے پہلے تعارف کا اختتام کرتا ہے، لیکن یہ ان کے ساتھ ہمارے تعامل کا صرف آغاز ہے۔ مندرجہ ذیل اسباق میں، ہم ان کے استعمال کے دلچسپ طریقے دیکھیں گے، اور یہ بھی سیکھیں گے کہ جاوا کے پاس کون سے بلٹ ان فنکشنز ہیں جو ہمیں اس ڈیٹا ڈھانچے کے ساتھ زیادہ آسانی سے کام کرنے دیتے ہیں :)
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION