CodeGym /وبلاگ جاوا /Random-FA /معکوس کردن یک آرایه در جاوا
John Squirrels
مرحله
San Francisco

معکوس کردن یک آرایه در جاوا

در گروه منتشر شد
آرایه ها اغلب در کدنویسی استفاده می شوند و راهی برای ذخیره چندین مقدار از یک نوع در یک متغیر هستند. ممکن است دلایل زیادی وجود داشته باشد که چرا یک کدنویس بخواهد یک آرایه را معکوس کند. ممکن است لازم باشد یک آرایه معکوس شود، برای مثال، زمانی که منطق یک مشکل باید با آخرین عنصر شروع شود. در این مورد، بهترین روش این است که معکوس را انجام دهید و سپس در صورت لزوم از آرایه معکوس در کد استفاده کنید. حتی بیشتر، معکوس کردن یک آرایه یک کار بسیار محبوب در مصاحبه‌های Java Juniors است.

نحوه معکوس کردن یک آرایه

راه های زیادی برای معکوس کردن یک آرایه وجود دارد، و در اینجا ما 5 را در نظر می گیریم. برای گزینه 1، یک آرایه با استفاده از یک آرایه اضافی که به ترتیب صعودی از انتهای آرایه اصلی (نزولی) پر می شود، معکوس می شود، در گزینه 2 یک معکوس در محل. در جایی انجام می شود که عناصر آرایه در ابتدا و انتهای آن جابجا می شوند، در گزینه 3، از متد reverse() از چارچوب Collections برای انجام معکوس استفاده می شود، در گزینه 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;
   }
}
در این مثال، روشی نوشتیم که یک آرایه را معکوس می کند و یک آرایه معکوس جدید را بر اساس آرایه ای که به آن ارسال شده است، برمی گرداند. آرایه در main اعلام می شود و سپس یک متد معکوس فراخوانی می شود. آرگومان متد آرایه است. در متد معکوس ، یک آرایه جدید به نام 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 ، یک متغیر temp ایجاد و استفاده می شود. در حلقه for ترتیب معکوس در سه مرحله به دست می آید:
  1. تخصیص اولین عنصر به temp
  2. تخصیص آخرین عنصر به عنصر اول
  3. تخصیص دما به آخرین عنصر
سپس دوباره این بار برای عنصر دوم و دوم از آخرین عنصر و غیره انجام می شود. این برای عناصر متوالی آرایه انجام می شود اما حلقه فقط تا نصف اندازه آرایه تکرار می شود. اساساً عناصر در انتهای مخالف آرایه با هم مبادله می شوند. این روش دو برابر سریعتر از یک روش با استفاده از یک حلقه for از 0 به اندازه اجرا می شود. در نتیجه ترتیب معکوس آرایه به دست می آید و به ما نشان داده می شود که چگونه یک آرایه را به ترتیب معکوس چاپ کنیم و مقادیر چاپ می شوند:
آرایه قبل از معکوس: [1، 4، 9، 16، 25] آرایه پس از معکوس: [25، 16، 9، 4، 1]

گزینه 3: استفاده از Collections.reverse()

در جاوا، روش معکوس ، که بخشی از چارچوب مجموعه های موجود است، می تواند برای معکوس کردن یک آرایه استفاده شود. بیایید از آن برای انجام معکوس استفاده کنیم.
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 (آرایه) چاپ می شود و سپس تابع، معکوس ، فراخوانی می شود و آرایه به عنوان آرگومان به این تابع ارسال می شود. در معکوس ، 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 قرار داده می شود . این روش اساساً با حذف آخرین عنصر و درج آن در جلوی آرایه کار می کند. در نهایت، وضعیت جدید (معکوس) آرایه به کنسول خروجی می شود. در متد ()reverse ، آرایه از طریق Arrays.asList(array) به یک List نوشته می‌شود تا متدهای add() و remove() برای انجام معکوس شدن فعال شوند. این روش اساساً با حذف آخرین عنصر و درج آن در جلوی آرایه کار می کند. مراحل استفاده از reverse() به شرح زیر است. از یک حلقه for برای انجام معکوس کردن عناصر لیست استفاده می کند. این کار را با مقداردهی اولیه یک متغیر i انجام می دهد . در ابتدا i روی 0 تنظیم می شود. وقتی i = 0 باشد ، عنصر موجود در list.size() - 1 در لیست حذف می شود و از i < list.size() - 1 همیشه آخرین عنصر خواهد بود . از آنجایی که متد remove() عنصری را که حذف کرده است برمی گرداند، این عنصر اکنون در فهرست i = 0 به لیست اضافه می شود ، یعنی در ابتدا درج می شود. سپس بقیه لیست به سمت راست منتقل می شود، اما لیست جدید همچنان همان تعداد عناصر را دارد، به عنوان مثال، اندازه . با ادامه اجرای حلقه for با مقدار بعدی i , i = 1 , همان مجموعه مراحل انجام می شود بنابراین آخرین عنصر حذف شده و به اعداد i = 1 وارد می شود و لیست به سمت راست منتقل می شود. این تا زمانی ادامه دارد که آخرین مقدار افزایشی i و تمام عناصر موجود در لیست تغییر کند. در دومین عنصر حلقه for لیست با ایندکس i روی عنصر آرایه با شاخص i تنظیم می شود که i از 0 تا list.size() - 1 است . به طور خلاصه، مراحل استفاده شده عبارتند از: مراحل:
  1. i = 0
  2. حذف عنصر در list.size() - 1
  3. درج عنصر، که در list.size() - 1 ، در i = 0 بود
  4. افزایش i
  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: معکوس کردن یک آرایه با بازگشت

روش بازگشت به طور گسترده در کدنویسی استفاده می شود و می تواند برای ایجاد یک روش کارآمد در مورد نحوه معکوس کردن یک آرایه استفاده شود. در این گزینه، آرایه به یک لیست تبدیل می شود و سپس کد به متد ()reverse می رود و هر بار آخرین عنصر انتهای لیست را حذف می کند و لیست مقادیر حذف شده را به ترتیب معکوس به آن اضافه می کند. همانند روش های قبلی، آرایه ای متشکل از 5 عدد ایجاد می شود. سپس به عنوان آرگومان به تابع ()reverse ارسال می شود . در reverse() اولین کاری که انجام می شود تبدیل آرایه به لیست و بررسی اندازه لیست است. اگر فقط یک عنصر داشته باشد یا تهی باشد، متد تمام می شود و برمی گردد. در غیر این صورت، اولین عنصر حذف می شود، اما در یک مقدار صحیح کپی می شود . سپس متد 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 یک تابع جاوا از قبل موجود، آزمایش شده و آزمایش شده است. البته می توان از گزینه های دیگر مخصوصاً در حین یادگیری استفاده کرد، اما به طور کلی روش های استاندارد، در صورت وجود، بهترین هستند زیرا معمولاً بسیار بهینه و آزمایش شده هستند. با این حال، ممکن است خودتان چنین روش هایی را ایجاد کنید زیرا این یک تمرین کدنویسی خوب است و به شما کمک می کند در مصاحبه خود برای جاوا جونیور موفق شوید.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION