در این آموزش قصد داریم تا نحوۀ Sort یا «مرتب کردن» اِلِمانهای تشکیلدهندۀ یک آرایه را در زبان برنامهنویسی جاوا مورد بررسی قرار دهیم و برای این منظور نیاز است تا حتماً مباحث مربوط به آرایهها در آموزشهای پیشین را به خوبی درک کرده باشیم. حال جهت درک کاربرد مرتبسازی اِلِمانهای تشکیلدهندۀ یک آرایه، سناریویی از دنیای واقعی را بدین صورت در نظر میگیریم که قصد داریم تا اسامی مربوط به بازیگران فیلمی همچون «جدایی نادر از سیمین» را مرتب کرده سپس در اختیار تیم فیلمبرداری و مونتاژ قرار دهیم تا در تیتراژ پایانی نام بازیگران را بر اساس ترتیب اِعمالشده نمایش دهند.
برای این منظور، یک پروژۀ جدید تحت عنوان ANaderSiminSeperation تعریف میکنیم و همچنین کلاسی به نام AlphabeticOrder در آن میسازیم. حال به منظور ذخیرهسازی دادههای مربوط به اسامی بازیگران نیاز به استفاده از کلاس String داریم تا بتوانیم یک آرایه از جنس String تعریف کنیم و از آنجایی که این فیلم شش بازیگر اصلی دارد، آرایهای به طول 6 تعريف میکنیم:
public class AlphabeticOrder {
public static void main(String[] args) {
String[] castNames = new String[6];
}
}
همانطور که در کد فوق ملاحظه میکنیم، ابتدا نوع دادۀ String را ذکر کرده و در ادامه علائم [] را قرار دادهایم سپس نام آرایه را castNames انتخاب کرده و در ادامه با بهکارگیری کیورد new به کامپایلر دستور میدهیم تا آبجکتی جدید از جنس آرایه تحت عنوان castNames بسازد و با قرار دادن عدد 6 مقابل نوع دادۀ Stirng داخل علائم [] تعداد اِلِمانهای آرایه را مشخص میکنیم. اکنون آرایهای به طول 6 از جنس استرینگ داریم که در ادامه و در کد زیر اسامی تکتک بازیگران را بر اساس ترتیبی دلخواه وارد آن میکنیم:
public class AlphabeticOrder {
public static void main(String[] args) {
String[] castNames = new String[6];
castNames[0] = "Zareyee Merila";
castNames[1] = "Hosseini Shahab";
castNames[2] = "Bayat Sareh";
castNames[3] = "Moadi Peyman";
castNames[4] = "Hatami Leila";
castNames[5] = "Farhadi Sarina";
}
}
همانطور که در کد فوق ملاحظه میکنیم، اول نام خانوادگی بازیگران سپس نام آنها را در آرایۀ castNames وارد کردهایم چرا که در این مثال میخواهیم تا اسامی بازیگران را بر اساس نام خانوادگی مرتب نماییم. در این مرحله نیاز به تعریف حلقهای از جنس for داریم تا در هر بار تکرار آن بتوانیم اسامی بازیگران را بر اساس حروف الفبا یکی پس از دیگر نمایش دهیم و از همین روی یک حقله ایجاد کرده و پارامترهای آن را به صورت زیر تعریف میکنیم:
public class AlphabeticOrder {
public static void main(String[] args) {
String[] castNames = new String[6];
castNames[0] = "Zareyee Merila";
castNames[1] = "Hosseini Shahab";
castNames[2] = "Bayat Sareh";
castNames[3] = "Moadi Peyman";
castNames[4] = "Hatami Leila";
castNames[5] = "Farhadi Sarina";
for (int number = 0; number < castNames.length; number++) {
}
}
}
در کد فوق، نقطۀ شروع حلقه را عدد 0 قرار داده و نقطۀ پایان را با استفاده از اتریبیوت length برابر با طول آرایۀ castNames تعریف کردهایم و در پارامتر سوم نیز گفتهایم در هر بار تکرار حلقه یک واحد به عدد پیشین اضافه شده و در صورت برقرار بودن شرایط حلقه نیز دستورات داخلی آن اجرا شوند. حال میخواهیم تا خروجی برنامه را در پنچرۀ کنسول به نمایش درآوریم و از همین روی کد فوق را به شکل زیر تکمیل میکنیم:
public class AlphabeticOrder {
public static void main(String[] args) {
String[] castNames = new String[6];
castNames[0] = "Zareyee Merila";
castNames[1] = "Hosseini Shahab";
castNames[2] = "Bayat Sareh";
castNames[3] = "Moadi Peyman";
castNames[4] = "Hatami Leila";
castNames[5] = "Farhadi Sarina";
for (int number = 0; number < castNames.length; number++) {
System.out.println((number+1) + ": " + castNames[number]);
}
}
}
با اجرای برنامۀ فوق، هر یک از استرینگهای مرتبط به نام بازیگران به ترتیب به اندیسهای 0 تا 5 از آرایۀ castNames اختصاص داده میشوند و با اجرای حلقۀ for نیز مقدار اولیۀ 0 به متغیر number اختصاص یافته و شرط حلقه چک میشود بدین صورت آیا مقدار منتسب به متغیر number کمتر از طول آرایه است که شرط true ارزیابی شده و از همین روی دستورات داخلی حلقه اجرا میشوند که در آن گفتهایم ابتدا محاسبات ریاضیاتی داخل پرانتز معادل افزایش یک واحدیِ مقدار متغیر number برابر با عدد 0 انجام شده سپس این مقدار با کاراکتر «:» کانکت شده و در ادامه اِلِمان مربوط به اندیس 0 از آرایۀ castNames با آنها کانکت شده و در کنسول چاپ شوند (افزایش یک واحدیِ مقدار متغیر number بدین دلیل انجام میشود تا اسامی بازیگران با شروع از عدد 1 در کنسول چاپ شوند.)
در ادامه، حلقۀ for تکرار شده و مقدار قبلیِ منتسب به متغیر number معادل عدد 1 یک واحد افزایش پیدا کرده و عدد 2 بدان اختصاص داده میشود سپس مجدداً شرط حلقه چک میشود که این بار نیز شرط برقرار است چرا که عدد 2 از طول آرایه معادل عدد 6 کوچکتر است و از همین روی دستورات داخلی حلقه اجرا شده و نام بازیگر دوم مربوط به اندیس 1 با شمارۀ 2 کانکت شده و در کنسول چاپ میگردد و اين فرآيند تا رسيدن مقدار متغير number به عدد 6 تكرار میشود که با اجرای برنامه در خروجی خواهیم داشت:
1: Zareyee Merila
2: Hosseini Shahab
3: Bayat Sareh
4: Moadi Peyman
5: Hatami Leila
6: Farhadi Sarina
همانطور که ملاحظه میکنیم، اسامی بازیگران به همان ترتیبی که نوشته شده بودند در بخش کنسول به نمایش درآمدهاند و شمارۀ ردیفها نیز از عدد 1 شروع میشود اما لیست فوق بر اساس حروف الفبا مرتب نشده است که برای این منظور نیاز به فراخوانی متد ()sort از کلاس Arrays داریم که میباید کد خود را به صورت زیر تکمیل کنیم:
import java.util.Arrays;
public class AlphabeticOrder {
public static void main(String[] args) {
String[] castNames = new String[6];
castNames[0] = "Zareyee Merila";
castNames[1] = "Hosseini Shahab";
castNames[2] = "Bayat Sareh";
castNames[3] = "Moadi Peyman";
castNames[4] = "Hatami Leila";
castNames[5] = "Farhadi Sarina";
Arrays.sort(castNames);
for (int number = 0; number < castNames.length; number++) {
System.out.println((number+1) + ": " + castNames[number]);
}
}
}
در کد فوق، پیش از شروع حلقۀ for متد ()sort از کلاس Arrays را فراخوانی کردهایم که برای دسترسی به این کلاس نیز ابتدا باید آن را در برنامه ایمپورت کنیم. بنابراین مشابه آموزشهای پیشین و به منظور فراخوانی کلاسی از پیش تعریفشده در زبان برنامهنویسی جاوا، به سه روش میتوانیم عمل کنیم که عبارتند از ایمپورت کردن کلاس Arrays به صورت دستی، قرار دادن نشانگر ماوس روی واژۀ Arrays و انتخاب گزینۀ مرتبط با ایمپورت این کلاس و همچنین فشردن همزمان کلیدهای Ctrl + Shift + O که در نهایت انتخاب هر یک از سه روش مذکور منجر به اضافه شدن دستور سطر اول به ابتدای برنامه میشود (لازم به یادآوری است که بسته به تنظیمات ادیتور، ممکن است کلیدهای ترکیبی فوق متفاوت باشند.)
حال پس از دسترسی به کلاس Arrays و فراخوانی متد ()sort در ادامه آرایۀ castNames را به عنوان آرگومان ورودی به متد مذکور میدهیم تا بدین ترتیب متد ()sort روی اِلِمانهای این آرایه اِعمال شده و آنها را بر اساس حروف الفبای انگلیسی از A تا Z مرتب کرده و در نهایت اِلِمانهای مرتبشده را مجدداً به آرایۀ castNames منتسب کند.
| نکته |
| در زبان برنامهنویسی جاوا عملکرد متد ()sort بدین شکل است که حروف الفبا را از A تا Z مرتب کرده و در مورد اعداد هم آنها را به صورت صعودی مرتب میکند. |
در ادامه، حلقۀ for در کد فوق اجرا شده و هر یک از اِلِمانهای آرایه مذکور با شروع از عدد 1 و بر اساس ترتیب حروف الفبای انگلیسی در خروجی چاپ میشوند به طوری که با اجرای مجدد برنامه در خروجی خواهیم داشت:
1: Bayat Sareh
2: Farhadi Sarina
3: Hatami Leila
4: Hosseini Shahab
5: Moadi Peyman
6: Zareyee Merila
همانطور که ملاحظه میکنیم، نامهای خانوادگی بر اساس حروف الفبا مرتب شده و بر همین اساس نیز با شروع از عدد 1 تا 6 در کنسول چاپ شدهاند.
