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


در این آموزش قصد داریم تا نحوه ی Sort کردن یا مرتب کردن عناصر تشکیل دهنده یک آرایه مورد بررسی قرار دهیم (برای این منظور نیاز است تا حتماً جلسات مربوط به آرایه ها و همچنین حلقه ها به خوبی درک شده باشند.)

به منظور درک بهتر فایده مرتب کردن در برنامه نویسی موقعیتی را در نظر خواهیم گرفت که ممکن است در دنیای واقع اتفاق افتد. فرض کنیم که در تیم تهیه فیلم سینمایی جدایی نادر از سیمین به عنوان مدیر آی تی مشغول به کار بودیم. کار فیلم برداری و مونتاژ به پایان رسیده و همکاران ما مشغول تهیه تیتراژ پایانی هستند. در واقع همکاران ما بر اساس روالی که در تیتراژ پایانی معمول است، می خواهند تا اسامی بازیگران فیلم را به ترتیب حروف الفبا بنویسند. برای این منظور از ما -که یک برنامه نویس هستیم- کمک می خواهند.

برای این کار یک پروژه جدید تعریف می کنیم تحت عنوان A Nader Simin Seperation به معنی "جدایی نادر از سیمین" و همچنین کلاسی به اسم AlphabeticOrder به معنی "ترتیب الفبا" در آن ایجاد می کنیم. از آن جا که اسامی بازیگران به داده هایی از جنس استرینگ در زبان برنامه نویسی جاوا تبدیل خواهند شد، پس نیاز داریم تا یک آرایه از جنس کلاس String ایجاد کنیم. از آنجا که این فیلم شش بازیگر اصلی داشت، در آرایه ای که ایجاد می کنیم عدد شش را نیز وارد می کنیم: کد ما به شکل زیر خواهد بود:

public class AlphabeticOrder {
    public static void main(String[] args) {
        String[] castNames = new String[6];
    }
}

همان طور که در کد فوق ملاحظه می شود نام این آرایه را 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] = "Peyman Moadi";
        castNames[4] = "Hatami Leila";
        castNames[5] = "Farhadi Sarina";
    }
}

همانطور که در کد فوق ملاحظه می شود اول نام خانوادگی بازیگران سپس نام آن ها وارد شده است چرا که می خواهیم در این مثال بر اساس نام خانوادگی اسامی بازیگران را Sort یا مرتب نماییم. در این مرحله از برنامه نویسی نیاز به یک حلقه ای از جنس for داریم تا در هر بار لوپ شدن یک عدد به لیست اضافه شده و سپس اسامی بازیگران البته بر اساس حروف الفبا یکی پس از دیگر نمایش داده شوند. از این رو، یک حقله از جنس 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] = "Peyman Moadi";
        castNames[4] = "Hatami Leila";
        castNames[5] = "Farhadi Sarina";
        for (int number = 0; number < 6; number++) {
        }
    }
}

در این حلقه نقطه ی شروع را عدد صفر در نظر می گیریم و نقطه پایان را عدد شش و در هر بار لوپ شدن، یک واحد به عدد پیشین اضافه خواهد شد. حال می خواهیم تا خروجی برنامه را در پنچره ی کنسول به نمایش در آوریم، از این رو کد فوق را به شکل زیر تکمیل می کنیم:

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] = "Peyman Moadi";
        castNames[4] = "Hatami Leila";
        castNames[5] = "Farhadi Sarina";
        for (int number = 0; number < 6; number++) {
            System.out.print(number + ": " + castNames[number] + "\n");
        }
    }
}

در دستور ;()System.out.println با نوشتن واژه ی number این دستور را به کامپیوتر می دهیم که عدد حلقه که از صفر آغاز شده و در هر بار لوپ شدن یک عدد به آن اضافه می شود، نمایش داده شود که این به منزله شماره ردیف خواهد بود. پس از آن یک علامت : به همراه یک Space قرار می دهیم سپس نام آرایه ی خود که castNames است را می نویسیم که در هر بار لوپ شدن یکی از عناصر آرایه ی برنامه ی ما نیز به نمایش در آید.

نکته ای که در اینجا می بایست مد نظر قرار داده شود این است که مقابل نام castNames که نام آرایه است می بایست در داخل علامت های [ ] شماره ی عنصری که از آرایه که می خواهیم به نمایش در آید را نیز بنویسیم. به طور مثال اگر بخواهیم که نام شهاب حسینی به نمایش در آید می توانیم [castNames[1 را فرا بخواهیم. سپس یک علامت n\ قرار داده تا در هر بار لوپ شدن، نوشتن کلمات به خط بعد انتقال یابد.

اما از آنجا که می خواهیم به همان ترتیبی که حلقه اجرا می شود عناصر داخل آرایه نیز نمایش داده شوند، از اینرو به جای وارد کردن یک عدد نام حلقه را که number می باشد را وارد می کنیم. به عبارت دیگر در لوپ اول که لوپ صفر است، اولین عنصر که مریلا زارعی است نمایش داده شده که جایگاه آن هم صفر است و در لوپ دوم که جایگاه آن یک است شهاب حسینی نمایش داده شده که جایگاه آن یک است و الی آخر. حال برنامه خود را اجرا می کنیم:

همان طور که ملاحظه می شود اسامی به همان ترتیبی که نوشته شده بودند روی صفحه مانیتور به نمایش در می آیند و از آنجایی که اولین جایگاه در یک آرایه جایگاه صفر است، شماره ردیف ها نیز از صفر شروع می شود. اما ترتیب لیست فوق بر اساس حروف الفبا نیست. برای این کار، می بایست کد خود را به صورت زیر تکمیل کنیم:

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] = "Peyman Moadi";
        castNames[4] = "Hatami Leila";
        castNames[5] = "Farhadi Sarina";
        Arrays.sort(castNames);
        for (int number = 0; number < 6; number++) {
            System.out.print(number + ": " + castNames[number] + "\n");
        }
    }
}

در کد بالا که ویرایش شده است، پیش از شروع حلقه ی for کلاسی تحت عنوان Arrays را به برنامه فرا خوانده ایم و پس از آن یک متد تحت عنوان ()sort را نوشته ایم. در این مرحله از آنجا که ما قصد داریم تا یک کلاس ایجاد شده در API زبان برنامه نویسی جاوا را فرا بخوانیم، پس نیاز است تا این کلاس را به برنامه خود Import کنیم. برای این کار، همان طور که در آموزش های پیشین توضیح داده شد یا عبارت ;import java.util.Arrays را به صورت دستی وارد می کنیم و یا نشانگر موس خود را روی خط چین دور واژه ی Arrays نگه داشته سپس گزینه Import را می زنیم و یا کلید های Ctrl و Shift و O را به صورت هم زمان می فشاریم و عملیات import کلاس Arrays صورت خواهد پذیرفت.

اکنون برای آن که به این متد دستور دهیم که چه چیزی را sort کند داخل پرانتز، نام آرایه ی خود را می نویسیم. از این پس، پیش از آن که برنامه وارد لوپ شود، این متد اجرا شده، اسامی به ترتیب حروف الفبا در خواهند آمد سپس برنامه وارد لوپ خواهد شد. مجدد برنامه را اجرا کرده و خروجی برنامه به شکل زیر خواهد بود:

همان طور که ملاحظه می شود، نام های خانوادگی بر اساس حروف الفبا مرتب شده اند (در این لیست چیزی که تا حدودی غیر طبیعی است این است که ردیف خانم ساره بیات ردیف صفر است و این در حالی است که در هیچ تیتراژ پایانی فیلمی اولین جایگاه به صفر اختصاص داده نمی شود و اسامی از جایگاه یک شروع می شوند!)

نکته
در حقیقت در زبان برنامه نویسی جاوا عملکرد متد sort به این شکل است که در مورد حروف الفبا آن ها را از A تا Z مرتب می کند و در مورد اعداد هم آن ها را به صورت صعودی مرتب می کند نه نزولی!

در آموزش بعد، با نحوه جمع کردن Element های یک آرایه با یکدیگر آشنا خواهیم شد.

دانلود فایل‌های تمرین
لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
پویا نظری
پویا نظریتوسعه‌دهنده‌ موبایل اپ، دانشجوی نرم‌افزار
عاشق سناریو هاتون هستم
ممنون عالی بود
کاربر میهمان
کاربر میهمان
با سلام و تشکر از استاد گرامی بابت آموزش های خودتون
سوالی که برام پیش اومده اینه که چرا به جای اینکه آخر دستورمون از nاستفاده کنیم از println به جای print استفاده نکردیم؟
جفتشون یه نتیجه رو میده
a.huss.dar
a.huss.dar
سلام اگه به جای Println از Print استفاده کنید چیزی که در بخش System.out در یکخط نمایش داده می شود و زیر نمایش پیدا نمیکند.

در پاسخ به

کاربر میهمان
کاربر میهمان
ادامه کد :

for (int number = 1; number
کاربر میهمان
کاربر میهمان
برای مشکل از ۰ شروع شدن میشه این کارو کرد

String[] castNames = new String[7];
castNames[0] = "";
castNames[1] = "Zareyee Merila";
castNames[2] = "Hosseini Shahab";
castNames[3] = "Bayat Sareh";
castNames[4] = "Peyman Moadi";
castNames[5] = "Hatami Leila";
castNames[6] = "Farhadi Sarina";

Arrays.sort(castNames);
for (int number = 1; number
کاربر میهمان
کاربر میهمان
خب گویا در این محیط نمیشه همه ی کد رو کپی کرد و کامل نمیاد
کاربر میهمان
کاربر میهمان

String[] ar= {"rational","gold","bold","focal","vanish","goal","official","broad"};
int n=ar.length;
for(int x=0; x
کاربر میهمان
کاربر میهمان
درود؛ با سپاس از کار ارزشمند شما؛
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
کاربر میهمان
کاربر میهمان
سلام
با تشکر از آموزش عالیتون.
من یک برنامه دفتر تلفن تو اموزشای قبلی رو یکم عوض کردم که شماره تلفن و نام فرد رو بگیره و نهایتا نمایش بده.
برای مرتب سازی بر اساس نام چه کار کنم؟
ccc ccc
ccc ccc
سلام
یک سری الگوریتم های مرتب سازی از قبل نوشته شده هست که می تونید با یادگیری اون الگوریتم ها، برنامه رو سورت کنید. برای یادگیری این الگوریتم ها به مباحث موجود در ساختمان داده ها مراجعه کنید.

در پاسخ به

bijan9
bijan9
مرسی
فقط پیمان معادی رو جا به جا نوشتین
عیسی پور
عیسی پور
عالی بود
خسته نباشید