CodeGym /مدونة جافا /Random-AR /عكس صفيف في جافا
John Squirrels
مستوى
San Francisco

عكس صفيف في جافا

نشرت في المجموعة
تُستخدم المصفوفات بشكل متكرر في البرمجة وهي وسيلة لتخزين قيم متعددة من نفس النوع في متغير واحد. قد يكون هناك العديد من الأسباب التي قد تجعل المبرمج يرغب في عكس المصفوفة. قد يكون من الضروري عكس المصفوفة، على سبيل المثال، عندما يحتاج منطق المشكلة إلى البدء بالعنصر الأخير. في هذه الحالة، أفضل الممارسات هي القيام بالعكس ثم استخدام المصفوفة المعكوسة عند الضرورة في التعليمات البرمجية. علاوة على ذلك، يعد عكس المصفوفة مهمة شائعة جدًا في مقابلات Java Juniors.

كيفية عكس مصفوفة

هناك العديد من الطرق لعكس المصفوفة، وهنا نفكر في 5. بالنسبة للخيار 1، يتم عكس المصفوفة باستخدام مصفوفة إضافية مملوءة بترتيب تصاعدي من نهاية المصفوفة الأصلية (تنازلي)، في الخيار 2، يتم عكس المصفوفة في المكان يتم تنفيذها حيث يتم تبديل عناصر المصفوفة في البداية والنهاية، في الخيار 3، يتم استخدام الطريقة العكسية () من إطار عمل المجموعات للقيام بالعكس، في الخيار 4، List.add() و List.remove() يتم استخدامهما، وأخيرًا، في الخيار 5، يتم استخدام التكرار.عكس صفيف في جافا - 1

الخيار 1: عكس مصفوفة باستخدام مصفوفة إضافية

دعونا نكتب طريقة بسيطة لعكس مصفوفة باستخدام مصفوفة إضافية . يستخدم هذا الخيار مصفوفة إضافية يتم ملؤها بدءًا من العنصر الأخير في المصفوفة الأصلية بترتيب تنازلي، أي أن العنصر الأول هو نفس العنصر الأخير في المصفوفة الأصلية، والثاني هو نفس الثاني من الأخير وهكذا حتى يتم ملء المصفوفة الإضافية.
import java.util.Arrays;

public class ReverseArrayDemo {

   public static void main(String[] args) {
       int[] array = {7, 8, 9, 10, 11};
       System.out.println("Array : " + Arrays.toString(array)); // print array

       // Call function to get reversed array
       int[] reversedArray = reverse(array);
       System.out.println("Reversed array : " + Arrays.toString(reversedArray)); // print reversed array
   }

   // Method returns a new reversed array, based on the array which was passed to it.
   static int[] reverse(int[] array) {
       int[] newArray = new int[array.length];

       for (int i = 0; i < array.length; i++) {
           newArray[array.length - 1 - i] = array[i];
       }

       return newArray;
   }
}
في هذا المثال، كتبنا طريقة تقوم بعكس مصفوفة وإرجاع مصفوفة معكوسة جديدة، بناءً على المصفوفة التي تم تمريرها إليها. يتم الإعلان عن المصفوفة بشكل رئيسي ثم يتم استدعاء الطريقة العكسية . الوسيطة للأسلوب هي المصفوفة. في الطريقة العكسية ، يتم إنشاء مصفوفة جديدة، newArray ، وهي بنفس حجم المصفوفة ، ولكنها فارغة تمامًا. يتم استخدام حلقة for لملء newArray وتعمل على طول المصفوفة بالكامل. يتم ذلك عن طريق البدء بالعنصر الأول في المصفوفة وإسناده إلى العنصر الأخير في newArray ، ثم أخذ العنصر الثاني من المصفوفة وإسناده إلى العنصر الأخير الثاني في newArray ، وهكذا؛ تتم تعبئة newArray بشكل عكسي. عند اكتمال حلقة for، يكون newArray ممتلئًا تمامًا وهو عكس المصفوفة تمامًا .
المصفوفة: [7، 8، 9، 10، 11] المصفوفة المعكوسة: [11، 10، 9، 8، 7]

الخيار 2: طباعة عناصر المصفوفة بترتيب عكسي

بالنسبة لهذا الخيار لعكس مصفوفة، ليست هناك حاجة لاستخدام مصفوفة إضافية، ولا يتم تحويلها إلى قائمة مصفوفات. بدلاً من ذلك، يتم وضع عناصر المصفوفة في ترتيب عكسي في مكانها . وهذا يعني أنه تم تبادلهما في الواقع. يتم تبديل العنصر الأول مع العنصر الأخير، ويتم تبديل العنصر الثاني مع العنصر الثاني من الأخير، وهكذا. يتم استخدام حلقة for ، وعند اكتمال ذلك، سيتم عكس المصفوفة . يبدو الرمز كما يلي:
import java.util.Arrays;
/*
reversing an array in-place
*/
public class ReverseArrayDemo {

   public static void main(String[] args) {
       int[] array = {1, 4, 9, 16, 25};
       System.out.println("Array before reverse : " + Arrays.toString(array));

       arrayReverse(array);
       System.out.println("Array after reverse : " + Arrays.toString(array));
   }
//arrayReverse is a method that reverses array in-place
   static void arrayReverse(int[] array) {
       for (int i = 0; i < array.length / 2; i++) {
           int temp = array[i];
           array[i] = array[array.length - i - 1];
           array[array.length - i - 1] = temp;
       }
   }
}
تتم طباعة المصفوفة الأصلية كسلسلة باستخدام Arrays.toString (array) ، ثم يتم تمرير المصفوفة الخاصة بنا كوسيطة إلى الاتجاه العكسي . في الطريقة العكسية في حلقة for ، يتم إنشاء واستخدام متغير، درجة الحرارة. في حلقة for يتم تحقيق الترتيب العكسي في ثلاث خطوات:
  1. تعيين العنصر الأول إلى درجة الحرارة
  2. إسناد العنصر الأخير إلى العنصر الأول
  3. تعيين درجة الحرارة إلى العنصر الأخير
ثم يتم تنفيذ ذلك مرة أخرى هذه المرة للعنصر الثاني والثاني للعنصر الأخير، وهكذا. يتم ذلك للعناصر المتعاقبة من المصفوفة ولكن الحلقة تتكرر فقط حتى نصف حجم المصفوفة. يتم بشكل أساسي تبديل العناصر الموجودة على طرفي نقيض من المصفوفة. سيتم تشغيل هذه الطريقة أسرع مرتين من الطريقة التي تستخدم حلقة for بدءًا من 0 إلى الحجم. ونتيجة لذلك يتم تحقيق الترتيب العكسي للمصفوفة ويظهر لنا كيفية طباعة مصفوفة بترتيب عكسي ويتم طباعة القيم:
المصفوفة قبل العكس : [1, 4, 9, 16, 25] المصفوفة بعد العكس : [25, 16, 9, 4, 1]

الخيار 3: استخدام Collections.reverse()

في Java، يمكن استخدام الطريقة العكسية ، والتي تعد جزءًا من إطار عمل المجموعات الموجود، لعكس مصفوفة. دعونا نستخدمها للقيام بالعكس.
import java.util.Arrays;
import java.util.Collections;

public class ReverseArrayDemo {

   public static void main(String[] args) {
       Integer[] array = {1, 4, 9, 16, 25};
       System.out.println("Array before reverse : " + Arrays.toString(array));

       reverse(array);
       System.out.println("Array after reverse : " + Arrays.toString(array));
   }
//method that reverses an array
   static void reverse(Integer[] array) {
       Collections.reverse(Arrays.asList(array));
   }
}
بشكل رئيسي ، يتم إنشاء المصفوفة وتعبئتها كمصفوفة أعداد صحيحة تحتوي على 5 أرقام. ثم تتم طباعتها كقائمة باستخدام Arrays.asList(array) ثم يتم استدعاء الدالة، عكس ، ويتم تمرير المصفوفة كوسيطة إلى هذه الوظيفة. في الاتجاه المعاكس ، يتم استخدام Collections.reverse ، ويتم استخدامه في قائمة المصفوفات، Arrays.asList(array) ، بدلاً من المصفوفة نفسها. ثم في الخطوة التالية، سنوضح كيفية طباعة مصفوفة بترتيب عكسي باستخدام System.out.println ، وهذه المرة تتم طباعة كل عنصر على نفس السطر:
المصفوفة قبل العكس : [1, 4, 9, 16, 25] المصفوفة بعد العكس : [25, 16, 9, 4, 1]

الخيار 4: عكس مصفوفة باستخدام List.add() و List.remove()

في هذا الخيار الجديد، يتم استخدام List.add() و List.remove() للقيام بالعكس. الطريقة التي يعمل بها ذلك هي تحويل المصفوفة إلى قائمة وإزالة العنصر الأخير من القائمة ووضعه في بداية القائمة. بعد تكرار القائمة بأكملها، تصبح القائمة الجديدة عكسًا للقائمة الأصلية. في الطريقة main() ، يتم إنشاء مصفوفة تتكون من 5 أرقام. ثم يتم إخراج الحالة الأصلية للمصفوفة إلى وحدة التحكم. يتم بعد ذلك وضع هذه المصفوفة كوسيطة للطريقة، Reverse() . تعمل هذه الطريقة بشكل أساسي عن طريق إزالة العنصر الأخير وإدراجه في مقدمة المصفوفة. وأخيرًا، يتم إخراج الحالة الجديدة (المعكوسة) للمصفوفة إلى وحدة التحكم. في الطريقة العكسية () ، تتم كتابة المصفوفة إلى قائمة عبر Arrays.asList(array) ، وذلك لتمكين طريقتي add () و remove () من تنفيذ عملية العكس. تعمل هذه الطريقة بشكل أساسي عن طريق إزالة العنصر الأخير وإدراجه في مقدمة المصفوفة. الخطوات المستخدمة للعكس () هي كما يلي. يستخدم حلقة for لعكس عناصر القائمة. يقوم بذلك عن طريق تهيئة المتغير i . في البداية تم تعيين i على 0. عندما i = 0 ، تتم إزالة العنصر الموجود في list.size() - 1 في القائمة ، وسيكون هذا دائمًا العنصر الأخير منذ i < list.size() - 1 . نظرًا لأن طريقة الإزالة () تُرجع العنصر الذي تمت إزالته، فسيتم الآن إضافة هذا العنصر إلى القائمة الموجودة في الفهرس i = 0 ، أي تم إدراجه في البداية. يتم بعد ذلك نقل باقي القائمة إلى اليمين ولكن القائمة الجديدة لا تزال تحتوي على نفس عدد العناصر، أي الحجم . مواصلة تنفيذ حلقة for بالقيمة التالية i , i = 1 , يتم تنفيذ نفس مجموعة الخطوات بحيث تتم إزالة العنصر الأخير ووضعه في الأعداد عند i = 1 ويتم نقل القائمة إلى اليمين. يستمر هذا حتى يتم تغيير القيمة الإضافية الأخيرة لـ i وجميع العناصر الموجودة في القائمة. في عنصر حلقة for الثاني من القائمة ذات الفهرس i، تم تعيينه على عنصر الصفيف ذو الفهرس i حيث يكون i من 0 إلى list.size() - 1 . لتلخيص الخطوات المستخدمة هي: الخطوات:
  1. ط = 0
  2. إزالة العنصر في list.size() - 1
  3. أدخل العنصر، والذي كان في list.size() - 1 ، عند i = 0
  4. زيادة ط
  5. كرر الخطوات من 2 إلى 4 (مع القيم الجديدة لـ i في الخطوة 3) حتى يتم استخدام القيمة التزايدية الأخيرة لـ i
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ReverseArrayDemo {

   public static void main(String[] args) {
       Integer[] array = new Integer[]{1, 4, 9, 16, 25};
       System.out.println("Array before reverse : " + Arrays.toString(array));

       reverse(array);
       System.out.println("Array after reverse : " + Arrays.toString(array));
   }

   static void reverse(Integer[] array) {
       List list = new ArrayList<>(Arrays.asList(array));

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

       for (int i = 0; i < list.size(); i++) {
           array[i] = list.get(i);
       }
   }
}
هذا الكود يعطي الإخراج:
المصفوفة قبل العكس : [1, 4, 9, 16, 25] المصفوفة بعد العكس : [25, 16, 9, 4, 1]

الخيار 5: عكس المصفوفة بالتكرار

تُستخدم طريقة العودية على نطاق واسع في البرمجة ويمكن استخدامها لإنشاء طريقة فعالة حول كيفية عكس المصفوفة. في هذا الخيار، يتم تحويل المصفوفة إلى قائمة ثم ينتقل الكود إلى الطريقة العكسية () في كل مرة يتم فيها إزالة العنصر الأخير في نهاية القائمة وتضاف إليها القيم المحذوفة بترتيب عكسي. كما في الطرق السابقة، يتم إنشاء مصفوفة مكونة من 5 أرقام. ثم يتم تمريرها كوسيطة إلى الدالة، reverse() . في الدالة العكسية () أول ما يتم فعله هو تحويل المصفوفة إلى قائمة والتحقق من حجم القائمة. إذا كان يحتوي على عنصر واحد فقط أو كان خاليًا، فستنتهي الطريقة وتعود. إذا لم يكن الأمر كذلك، تتم إزالة العنصر الأول، ولكن يتم نسخه إلى قيمة عدد صحيح . يتم بعد ذلك استدعاء الطريقة العكسية () مرة أخرى وتبدأ عملية العودية مرة أخرى. عند إدخال الدالة، يتم تنفيذ نفس الخطوات، والتحقق من الحجم، وإذا كانت القائمة أكبر من 1، فستكون الخطوة التالية هي إزالة العنصر الأول ثم القيام بالتكرار مرة أخرى. عندما يكون حجم القائمة هو 1، فإن الدالة Reverse() ‎ تعود إلى المكان الذي تم استدعاؤها منه، ثم تضاف إلى القائمة كل قيمة لتجعلها عكسًا تمامًا للقائمة الأصلية.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ReverseArrayDemo {

   public static void main(String[] args) {
       Integer[] array = new Integer[]{1, 4, 9, 16, 25};
       System.out.println("Array before reverse : " + Arrays.toString(array));

       List list = new ArrayList<>(Arrays.asList(array));
       reverse(list);
       System.out.println("Array after reverse : " + Arrays.toString(list.toArray()));
   }

   public static void reverse(List list) {
       if (list== null || list.size() <= 1) {
           return;
       }

       Integer value = list.remove(0);

       reverse(list);

       list.add(value);
   }
}
الإخراج هو:
المصفوفة قبل العكس : [1, 4, 9, 16, 25] المصفوفة بعد العكس : [25, 16, 9, 4, 1]

خاتمة

لقد نظرنا هنا إلى 5 طرق مختلفة لعكس المصفوفة. ربما يكون الخيار 3، الذي يستخدم إطار عمل المجموعات، هو أفضل طريقة للاستخدام نظرًا لأن Collections.reverse هي وظيفة Java موجودة بالفعل، وتم تجربتها واختبارها. بالطبع يمكن استخدام الخيارات الأخرى، خاصة أثناء التعلم، ولكن بشكل عام الأساليب القياسية، إن وجدت، هي الأفضل لأنها عادة ما تكون محسنة للغاية ومختبرة. ومع ذلك، يمكنك إنشاء مثل هذه الأساليب بنفسك نظرًا لأن هذا تمرين جيد للبرمجة وسيساعدك على النجاح في مقابلتك لـ Java Junior.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION