آشنایی با نحوۀ مرتب کردن مقادیر آرایه‌ها در زبان برنامه‌نویسی جاوا


در این آموزش قصد داریم تا نحوۀ 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 در کنسول چاپ شده‌اند.

دانلود فایل‌های تمرین

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
فاطمه طوسی مقدم
فاطمه طوسی مقدم
۱۳۹۸/۰۴/۱۹
اگه بخواهیم از کاربر تعداد فامیلی ک میخواد وارد کنه رو بدونیم چجوری باید بنویسیم؟؟؟؟ مثلا

import java.util.Arrays;


import java.util.Scanner;


public class familySort {


public static void main(String[] args) {


Scanner m = new Scanner(System.in);


System.out.print("please enter the number of the family that you want");


System.out.println(m.nextInt());


int number;


String[] family = new String[m];


for(number = 0 ; number
پویا نظری
پویا نظریدانشجوی نرم‌افزار
۱۳۹۷/۰۱/۰۷
عاشق سناریو هاتون هستم
ممنون عالی بود
کاربر میهمان
Hadit1993من یک کاربر مهمان هستم
۱۳۹۵/۱۱/۰۴
با سلام و تشکر از استاد گرامی بابت آموزش های خودتون
سوالی که برام پیش اومده اینه که چرا به جای اینکه آخر دستورمون از nاستفاده کنیم از println به جای print استفاده نکردیم؟
جفتشون یه نتیجه رو میده
کاربر میهمان
پیام خوش راهمن یک کاربر مهمان هستم
۱۳۹۴/۱۱/۰۶
درود؛ با سپاس از کار ارزشمند شما؛
2 تا بهبود که میشه به همچین برنامه ای داد این هست که هم شمار درایه های موجود رو با دستور length بگیریم و خودکارش کنیم و هم اینکه توی دستور System.out.println پایانی، بیایم و متغیر رو برای نمایش به علاوه یک کنیم تا نفر یکم، شماره ی صفر رو نگیره؛ مثلاً به کد زیر برای سامان دهی لغات زیر که نوشتم نگاه کنید(البته یه مقدار syntax ها توی این محیط جا به جا میشه:
String[] ar= {"rational","gold","bold","focal","vanish","goal","official","broad"};
int n=ar.length;
for(int x=0; x
کاربر میهمان
حسنمن یک کاربر مهمان هستم
۱۳۹۴/۰۹/۲۱
سلام
با تشکر از آموزش عالیتون.
من یک برنامه دفتر تلفن تو اموزشای قبلی رو یکم عوض کردم که شماره تلفن و نام فرد رو بگیره و نهایتا نمایش بده.
برای مرتب سازی بر اساس نام چه کار کنم؟
bijan9
bijan9
۱۳۹۴/۰۹/۱۹
مرسی
فقط پیمان معادی رو جا به جا نوشتین
عیسی پور
عیسی پور
۱۳۹۴/۰۹/۱۲
عالی بود
خسته نباشید