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

کلاس آرایه ها

در گروه منتشر شد
دوباره سلام! :) در درس امروز در مورد کلاس Arrays در جاوا صحبت خواهیم کرد. در درس آخر با چنین ساختار داده ای به نام آرایه آشنا شدیم. ما یاد گرفتیم که چگونه آنها را ایجاد کنیم و آنها را با داده پر کنیم. و ما به نحوه ذخیره آنها در حافظه نگاه کردیم. امروز به چند کار و نمونه کار با آرایه‌ها می‌پردازیم که اغلب در کارهای واقعی مشاهده می‌کنید. به عنوان مثال، این وضعیت را تصور کنید: ما یک آرایه از 10 عدد تصادفی داریم.
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
وظیفه ما این است که این آرایه را به ترتیب صعودی مرتب کنیم: از کوچکترین به بزرگترین. در پایان، باید به این صورت باشد: [-234، -2، 16، 26، 35، 43، 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 not in the right 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];
به این فکر کنید که چگونه این کار را با استفاده از آنچه قبلاً در مورد آرایه ها می دانید انجام می دهید؟ برای مثال، می‌توانید آرایه اعداد را در یک حلقه مرور کنید و عناصر آن را به‌طور متوالی در 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 فراخوانی خواهد شد. برای یک آرایه، خروجی چیزی شبیه به این خواهد بود: [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 عنصر اول اعداد در آرایه جدید کپی می شوند. خروجی کنسول: [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 ، خود آرایه ها متد () quals را لغو نمی کنند . بنابراین اگر سعی کنیم آنها را اینگونه با هم مقایسه کنیم
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));
   }
}
سپس ما نادرست می شویم. به این دلیل که Object.equals() که مراجع را با هم مقایسه می کند فراخوانی می شود. و بدیهی است که آنها متفاوت هستند! اما آنچه ما نیاز داریم مقایسه محتوای آرایه است نه مراجع. کلاس Arrays متد () quals را باطل می کند تا دقیقاً همان کاری را که ما می خواهیم انجام دهد:
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?");
       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