JavaRush /مدونة جافا /Random-AR /فئة المصفوفات واستخدامها

فئة المصفوفات واستخدامها

نشرت في المجموعة
مرحبا مجددا! :) في الدرس الأخير، تعرفنا على بنية البيانات مثل المصفوفة (مصفوفة Java)، وتعلمنا كيفية إنشاء المصفوفات، وملئها بالبيانات، وتعلمنا أيضًا كيفية تخزينها في الذاكرة. سنلقي اليوم نظرة على بعض المهام والأمثلة للعمل مع المصفوفات التي ستواجهها غالبًا في العمل الحقيقي. على سبيل المثال، تخيل هذا الموقف: لدينا مصفوفة مكونة من 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) في الخلية الأخيرة.

  • الآن دعنا نراجع جميع عناصر المصفوفة مرة أخرى، بدءًا من العنصر ذو الفهرس [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];
       }

   }
}
حسنًا، لقد فعلنا ذلك بشكل أو بآخر! يبدو أن المشكلة قد تم حلها، ولكن مرة أخرى: إذا كانت هناك حاجة إلى تنفيذها بشكل متكرر، فستحتوي التعليمات البرمجية على مجموعة من الحلقات المتطابقة. في الواقع، تم حل هذه المشكلات وغيرها من قبل منشئي Java منذ فترة طويلة، ولسنا بحاجة إلى "إعادة اختراع العجلة" وكتابة بعض التعليمات البرمجية لحلنا الخاص.

فئة مصفوفات جافا

ستساعدك فئة Java الخاصة على حل المشكلات النموذجية عند العمل مع المصفوفات - Arrays. تمت إضافة طرق إلى هذا الفصل لحل المشكلات الأكثر شيوعًا التي يواجهها مبرمجو Java في عملهم. على سبيل المثال، مهمة فرز المصفوفة، والتي حاولنا بأنفسنا التوصل إلى حلول لها، يمكن حلها في سطر واحد:
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(). صفائف Java نفسها لا تتجاوز toString(). لذلك إذا كنت تكتب فقط
System.out.println(numbers.toString());
سيتم استدعاء أسلوب toString()الفصل Object. في حالة المصفوفات سيكون الناتج كالتالي:

[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. وبناءً على ذلك، 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()؛ في المستقبل، سترى أكثر من مرة (وستكون سعيدًا بذلك) أن منشئو Java توقعوا الكثير من المواقف النموذجية التي يواجهها المبرمجون أثناء العمل، وقاموا بتنفيذ حلول جاهزة لهم في اللغة. يعد استخدام هذه الحلول أسهل وأكثر ملاءمة من إعادة اختراع العجلات، أليس كذلك؟ :) تأكد من قراءة وثائق الفصل الدراسي Arraysعلى موقع ويب Oracle . حظا موفقا في دراستك!
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION