JavaRush /جاوا بلاگ /Random-UR /صفوں کی کلاس اور اس کا استعمال

صفوں کی کلاس اور اس کا استعمال

گروپ میں شائع ہوا۔
ہیلو دوبارہ! :) پچھلے سبق میں، ہم نے ایک صف (Java array) جیسے ڈیٹا سٹرکچر سے واقفیت حاصل کی، ارے بنانے کا طریقہ سیکھا، انہیں ڈیٹا سے بھرنا، اور یہ بھی سیکھا کہ انہیں میموری میں کیسے محفوظ کیا جاتا ہے۔ آج ہم کچھ کاموں اور صفوں کے ساتھ کام کرنے کی مثالیں دیکھیں گے جن کا سامنا آپ کو اکثر حقیقی کام میں کرنا پڑے گا۔ مثال کے طور پر، اس صورت حال کا تصور کریں: ہمارے پاس بے ترتیب ترتیب میں لکھے گئے 10 نمبروں کی ایک صف ہے۔
//array Java, example
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
ہمارا کام اس صف کو صعودی ترتیب میں ترتیب دینا ہے: چھوٹی سے بڑی تعداد تک۔ آخر میں یہ اس طرح نظر آنا چاہئے:
[-234, -2, 16, 26, 35, 43, 80, 92, 99, 167]
ہم یہ کیسے کرتے ہیں؟ کام غیر معمولی ہے، ہم نے پہلے کبھی ایسا نہیں کیا:/ کوئی خیال؟ اندازہ لگانے کی کوشش کریں۔ یہاں ہم کیا کر سکتے ہیں، مثال کے طور پر:
  • صف کے تمام عناصر کے ذریعے اعادہ کریں۔ ہر عنصر کا اگلے کے ساتھ موازنہ کریں ( [0]کے ساتھ [1]، [1]کے ساتھ [2]، [2]کے ساتھ ، [3]وغیرہ)۔ اگر موجودہ صف کا عنصر اگلے سے بڑا ہے، تو ہم ان کو تبدیل کرتے ہیں اور اگلے عنصر پر جاتے ہیں۔ اگر نہیں، تو اسے اسی طرح چھوڑ دیں اور آگے بڑھیں۔

  • اس طرح، صف کے عناصر سے پہلے گزرنے کے بعد، سب سے بڑی قدر (167) آخری سیل میں ہونے کی ضمانت ہے۔

  • اب آئیے ایک بار پھر صف کے تمام عناصر سے گزرتے ہیں، عنصر کے ساتھ index کے ساتھ شروع کرتے ہوئے [0]، لیکن آخری عنصر تک (سب سے بڑی تعداد پہلے سے ہی اپنی جگہ پر ہے) اور وہی موازنہ اور تبادلہ کریں۔ 
    آخر میں، آخری سیل میں ہمارے پاس دوسری سب سے زیادہ قیمت (99) ہوگی۔

  • آئیے اس کام کو جتنی بار دہرائیں ہمارے پاس صف میں مائنس ون عناصر ہیں۔
صفوں کی کلاس اور اس کا استعمال - 2ہم خیال کے ساتھ آئے ہیں، جو کچھ باقی ہے وہ کوڈ لکھنا ہے۔ یہ اس طرح نظر آئے گا:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       for (int i = numbers.length - 1; i > 0; i--) {
           for (int j = 0; j < i; j++) {
           /* Compare the elements in pairs,
             if they are in the wrong order,
             then swap them */
               if (numbers[j] > numbers[j + 1]) {
                   int tmp = numbers[j];
                   numbers[j] = numbers[j + 1];
                   numbers[j + 1] = tmp;
               }
           }
       }

   }
}
ام... یہ تھوڑا سا پیچیدہ لگتا ہے -_- یہاں تک کہ اگر آپریشن کا عمومی اصول واضح ہے، تو آپ کو اس طرح کے بظاہر آسان کام کو حل کرنے کے لیے کافی کوڈ لکھنا پڑتا ہے۔ ٹھیک ہے، شاید ہم نے خود کو بہت زیادہ سمجھا ہے؟ شاید، ہم نے اب تک جو کام اٹھایا ہے وہ ہمارے لیے بہت مشکل ہے۔ آئیے کچھ آسان کرنے کی کوشش کرتے ہیں۔ مثال کے طور پر، آئیے اعداد کی ایک ہی صف کو لیں۔
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
ہمارا کام اس کے مواد کو دوسری صف میں کاپی کرنا ہے۔
int [] numbersCopy = new int[10];
اس بارے میں سوچیں کہ آپ پہلے سے موجود صفوں کے بارے میں علم کا استعمال کرتے ہوئے یہ کیسے کریں گے؟ آپ، مثال کے طور پر، ایک صف کو لوپ کر سکتے ہیں numbersاور اس کے عناصر کو ایک ایک کرکے لکھ سکتے ہیں numbersCopy:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = new int[10];

       for (int i = 0; i < numbers.length; i++) {

           numbersCopy[i] = numbers[i];
       }

   }
}
ٹھیک ہے، ہم نے کم و بیش یہ کر لیا ہے! ایسا لگتا ہے کہ مسئلہ حل ہو گیا ہے، لیکن ایک بار پھر: اگر اسے اکثر عمل میں لانے کی ضرورت ہوتی ہے، تو کوڈ میں ایک جیسی لوپس کا ایک گروپ ہوگا۔ درحقیقت، یہ اور دیگر مسائل جاوا کے تخلیق کاروں نے طویل عرصے سے حل کیے ہیں، اور ہمیں "پہیہ کو دوبارہ ایجاد کرنے" اور اپنے حل کے لیے کچھ کوڈ لکھنے کی ضرورت نہیں ہے۔

جاوا اری کلاس

جاوا کی ایک خصوصی کلاس آپ کو صفوں کے ساتھ کام کرتے وقت عام مسائل کو حل کرنے میں مدد کرے گی Arrays۔ جاوا پروگرامرز کو اپنے کام میں پیش آنے والے عام مسائل کو حل کرنے کے لیے اس کلاس میں طریقے شامل کیے گئے ہیں۔ مثال کے طور پر، ایک صف کو چھانٹنے کا کام، جس کے لیے ہم نے خود حل نکالنے کی کوشش کی، ایک لائن میں حل کیا جا سکتا ہے:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       Arrays.sort(numbers);

       System.out.println(Arrays.toString(numbers));

   }
}
طریقہ Arrays.sort()صف کو ترتیب دیتا ہے۔ مزید یہ کہ اس میں سرایت شدہ الگورتھم اس کوڈ سے کہیں زیادہ موثر بناتا ہے جو ہم نے لکھا ہے۔ کنسول آؤٹ پٹ:

[-234, -2, 16, 26, 35, 43, 80, 92, 99, 167]
براہ کرم نوٹ کریں: صف کو سٹرنگ میں تبدیل کرنے کے لیے، ہم نے ایک اور کلاس طریقہ استعمال کیا Arrays- Arrays.toString()۔ جاوا صفیں خود کو اوور رائڈ نہیں کرتی ہیں toString()۔ تو اگر آپ صرف لکھتے ہیں۔
System.out.println(numbers.toString());
toString()کلاس کا طریقہ کہا جائے گا Object۔ arrays کے معاملے میں، آؤٹ پٹ کچھ اس طرح ہوگا:

[I@4554617c
اب ہم اس بارے میں تفصیل میں نہیں جائیں گے کہ نتیجہ اس طرح کیوں نکلا؛ اصل بات یہ ہے کہ یہ واضح طور پر وہ نہیں ہے جس کی ہمیں ضرورت ہے۔ لیکن Arrays.toString() نے وہی کیا جو ہم چاہتے تھے۔ ویسے ہمارا کاپی کا مسئلہ بھی کلاس میں آسانی سے حل ہو جاتا ہے Arrays۔
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, numbers.length);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
جس طریقے سے Arrays.copyOf()ہم اپنی اصل صف کو پاس کرتے ہیں (جس سے ہمیں اقدار کو کاپی کرنے کی ضرورت ہوتی ہے) اور نئی صف کی لمبائی جس میں ہم ڈیٹا کاپی کرتے ہیں۔ اس صورت میں، ہم نے لمبائی کے طور پر اشارہ کیا numbers.length، کیونکہ ہم پوری صف کو کاپی کرنا چاہتے ہیں۔ اگر ہم صرف پہلے چند عناصر کو کاپی کرنا چاہتے ہیں، تو ہم نئی صف کے لیے ایک چھوٹی لمبائی کی وضاحت کر سکتے ہیں:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, 4);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
یہاں ہم نے نئی صف کی لمبائی 4 بتائی ہے۔ اس کے مطابق، صرف پہلے 4 عناصر کو numbersنئی صف میں کاپی کیا جائے گا۔ کنسول آؤٹ پٹ:

[167, -2, 16, 99]
ویسے، اگر آپ کو کسی صف کا حصہ کاپی کرنے کی ضرورت ہے، لیکن شروع سے نہیں، بلکہ "درمیان سے"، تو Arraysآپ یہ بھی کر سکتے ہیں:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOfRange(numbers, 2,6);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
نتیجہ:

[16, 99, 26, 92]
سیلز دو ( شامل ) سے لے کر چھ ( شامل نہیں ) کی تعداد کو نئی صف میں کاپی کیا گیا تھا۔ اس کے علاوہ، ہمیں ایک دوسرے کے ساتھ دو صفوں کا موازنہ کرنے کی ضرورت پڑ سکتی ہے۔ بالکل اسی طرح جیسے طریقہ کے ساتھ toString()، صفیں خود طریقہ کو اوور رائڈ نہیں کرتی ہیں equals()۔ لہذا اگر ہم ان کا اس طرح موازنہ کرنے کی کوشش کریں:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(numbers.equals(numbers2));
   }
}
ہم نتیجہ حاصل کرتے ہیں false. Object.equals()سب کے بعد، روابط کا موازنہ کرنے والا طریقہ کہا جائے گا ۔ اور یقیناً وہ مختلف ہیں! لیکن ہمیں صفوں کے مواد کا موازنہ کرنے کی ضرورت ہے، لنکس کا نہیں۔ کلاس Arraysمیں ایک اوور رائیڈڈ طریقہ ہے equals()جو بالکل وہی کرتا ہے جس کی ہمیں ضرورت ہے:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(Arrays.equals(numbers, numbers2));
   }
}
نتیجہ:

true
ویسے، کلاس Arraysنہ صرف عام صفوں کے ساتھ، بلکہ دو جہتی کے ساتھ بھی کامیابی سے کام کرتی ہے:
public class Main {

   public static void main(String[] args) {

       int[][] numbers = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

       int[][] numbersCopy = Arrays.copyOf(numbers, numbers.length);

       System.out.println("Are these two-dimensional arrays equal to each other?");
       System.out.println(Arrays.deepEquals(numbers, numbersCopy));

       System.out.println(Arrays.deepToString(numbersCopy));
   }
}
نتیجہ:

Равны ли эти двумерные массивы между собой?
true
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
جیسا کہ آپ دیکھ سکتے ہیں، طریقہ کار Arrays.copyOf()دو جہتی سرنی کو کاپی کرنے کا مقابلہ کرتا ہے۔ براہ کرم نوٹ کریں کہ اس صورت میں، دو جہتی صفوں کو کاپی کرتے وقت، ایک نام نہاد "اتلی کاپی" واقع ہوتی ہے۔ اور دو جہتی صفوں کا موازنہ کرنے اور انہیں کنسول میں آؤٹ پٹ کرنے کے لیے، خاص طریقے فراہم کیے گئے ہیں - deepEqualsاور deepToString(); مستقبل میں، آپ ایک سے زیادہ بار دیکھیں گے (اور اس کے بارے میں خوش ہوں گے) کہ جاوا کے تخلیق کاروں نے بہت سارے عام حالات کا پیش خیمہ دیکھا تھا جو پروگرامرز کو کام کرتے وقت درپیش ہوتے ہیں، اور انہوں نے ان کے لیے زبان میں تیار کردہ حل نافذ کیے تھے۔ ان حلوں کا استعمال پہیوں کو دوبارہ ایجاد کرنے سے کہیں زیادہ آسان اور آسان ہے، ٹھیک ہے؟ :) اوریکلArrays ویب سائٹ پر کلاس دستاویزات کو ضرور پڑھیں ۔ آپ کی تعلیم کے ساتھ گڈ لک!
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION