JavaRush /وبلاگ جاوا /Random-FA /کلاس آرایه ها و کاربرد آن

کلاس آرایه ها و کاربرد آن

در گروه منتشر شد
دوباره سلام! :) در درس آخر با چنین ساختار داده ای به عنوان آرایه (آرایه جاوا) آشنا شدیم، نحوه ایجاد آرایه ها، پر کردن آنها با داده ها و همچنین نحوه ذخیره آنها در حافظه را یاد گرفتیم. امروز به چند کار و نمونه کار با آرایه ها می پردازیم که اغلب در کارهای واقعی با آن ها مواجه خواهید شد. به عنوان مثال، این وضعیت را تصور کنید: یک آرایه از 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. در مورد آرایه ها، خروجی چیزی شبیه به این خواهد بود:

[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حاوی یک متد overrid شده است 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در وب سایت Oracle بخوانید . در تحصیلاتت موفق باشی
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION