در آموزش گذشته به پیادهسازی پروژهای به منظور دریافت دیتایی از نوع دادۀ char
پرداختیم و با استفاده از دستور switch
دستورات مختلفی را به ازای دریافت کاراکترهای متفاوتی تعریف نمودیم اما در این آموزش قصد داریم تا پروژۀ جدیدی جهت دریافت دیتایی از نوع استرینگ تعریف کرده و ببینیم که چگونه میتوان با بهکارگیری دستور switch
شرایط متفاوتی را در برنامه تعریف کرد تا به ازای دریافت استرینگهای مد نظر، دستورات خاصی در برنامه اجرا شوند.
در همین راستا و به منظور درک بهتر مطالب آموزشی، سناریویی را مد نظر قرار میدهیم که طی آن استرینگ مربوط به نام شهر را از ورودی دریافت کرده و با بررسی نام شهرهای تعریفشده، دستوری متناسب با نام شهر مذکور مبنی بر نمایش پیششمارۀ آن شهر در کنسول را اجرا کند.
نکتهای که پیش از شروع آموزش میباید حتماً مد نظر قرار دهیم این است که بهکارگیری دادهای از جنس استرینگ در دستور switch
از نسخۀ 7 به بعد در زبان برنامهنویسی جاوا امکانپذیر شده است و از همین روی برای پیادهسازی پروژۀ مورد نظر ابتدا نیاز داریم تا نسخۀ جاوای نصبشده روی سیستم خود را چک کنیم که برای این منظور دستور زیر را در ترمینال وارد میکنیم:
$ java -version
حال اگر شمارۀ مربوط به نسخۀ جاوای نصبشده روی سیستم پایینتر از 7 بود، میتوانیم آخرین نسخۀ ارائهشده از جاوا را دانلود کرده و با مراجعه به آموزش ابزارهای برنامهنویسی با زبان جاوا آن را روی سیستم خود نصب نماییم.
برای شروع، پروژهای به نام StrInSwitch ساخته و کلاسی تحت عنوان CityCode
در آن ایجاد میکنیم. حال برای آنکه بتوانیم به صورت دینامیک مقادیر استرینگ را وارد برنامه کنیم، میباید از کلاس Scanner
استفاده نماییم که از همین روی کلاس مذکور را به صورت زیر در برنامۀ خود ایمپورت کرده و با بهکارگیریِ کیورد new
آبجکتی جدید از روی آن میسازیم:
import java.util.Scanner;
public class CityCode {
public static void main(String[] args) {
Scanner keyboardInput = new Scanner(System.in);
String cityName = keyboardInput.next();
}
}
در کد فوق، یک آبجکت از روی کلاس Scanner
تحت عنوان keyboardInput
ایجاد کرده و با استفاده از دستور System.in
امکان دسترسی برنامه به بخش ورودی آیدیای را فراهم کردهایم و در ادامه متد از پیش تعریفشدۀ ()next
که متعلق به کلاس Scanner
است را روی آبجکت ساختهشده فراخوانی میکنیم تا بتوانیم دیتای ورودی از کاربر را بخوانیم. در سطر بعد، با استفاده از کلاس String
آبجکتی جدید تحت عنوان cityName
ساخته و نتیجۀ حاصل از فراخوانی متد ()next
روی متغیر keyboardInput
را بدان منتسب میکنیم تا دیتای ریترنشده در نتیجۀ این فراخوانی در آبجکت cityName
نگهداری شود.
در این مرحله دیتای مورد نظر از ورودی خوانده شده و در متغیر cityName
نگهداری میشود که در ادامه نیاز داریم تا با استفاده از دستور switch
مقادیر مختلفِ منتسب به این متغیر مبنی بر نام شهر مد نظر را بررسی کرده و به ازای هر یک از مقادیر مربوط به نام شهرها، دستور شرطی case
مربوطه را پیادهسازی نماییم تا در صورت برقرار بودن هر یک از کِیسها (برابر بودن نام شهر ورودی با استرینگ درجشده در مقابل دستور case
) دستورات مرتبط با آنها اجرا شده و استرینگی در قالب نمایش پیششمارۀ شهر مربوطه در خروجی چاپ شود. بنابراین کد فوق را به صورت زیر تکمیل مینماییم:
import java.util.Scanner;
public class CityCode {
public static void main(String[] args) {
System.out.print("Please Type the Name of the City: ");
Scanner keyboardInput = new Scanner(System.in);
String cityName = keyboardInput.next();
switch (cityName) {
case "mashhad":
System.out.println("Mashhad Code Is 051");
break;
case "arak":
System.out.println("Arak Code Is 086");
break;
case "abadan":
System.out.println("Abadan Code Is 061");
break;
case "tehran":
System.out.println("Tehran Code Is 021");
break;
case "amol":
System.out.println("Amol Code Is 011");
break;
case "chabahar":
System.out.println("Chabahar Code Is 054");
break;
case "sanandaj":
System.out.println("Sanandaj Code Is 087");
break;
default:
System.out.println("Sorry, This City Is Not Defined!");
}
keyboardInput.close();
}
}
در حقیقت، از آنجایی که میخواهیم تا دستور switch
مقدار منتسب به آبجکت ساختهشده از روی کلاس String
را مورد سنجش قرار دهد، میباید داخل پرانتز مقابل switch
نام متغیر مذکور یا cityName
را وارد کنیم و بدین ترتیب هر یک از کِیسهای مطرحشده در برنامه بررسی شده و اولین کِیسی که استرینگ درجشده در مقابل آن با استرینگ منتسب به cityName
برابر باشد، معادل مقدار بولین true
ارزیابی شده و دستور مرتبط با آن اجرا میگردد (توجه داشته باشیم که برخلاف نوع دادۀ char
مقادیری با دیتا تایپ String
داخل علائم " "
در مقابل دستور case
نوشته شدهاند.)
در عین حال، چنانچه هیچ یک از کِیسها برابر با مقدار بولین true
ارزیابی نشوند (مقدار استرینگ منتسب به متغیر cityName
با هیچ یک از استرینگهای نوشتهشده در مقابل دستورهای case
برابر نباشد.) دستور default
اجرا شده و استرینگی مبنی بر «تعریفنشده بودن شهر مورد نظر» در کنسول چاپ میشود. حال برنامۀ فوق را اجرا میکنیم به طوری که در خروجی خواهیم داشت:
Please Type the Name of the City: arak
Arak Code Is 086
با اجرای برنامۀ فوق و وارد کردن استرینگی به صورت «arak» با حروف کوچک، استرینگ مذکور به cityName
اختصاص داده شده و در ادامه هر یک از دستورهای case
بررسی میشوند تا اینکه استرینگ نوشتهشده در مقابل کِیس دوم با استرینگ منتسب به آبجکت مذکور برابر بوده و دستور شرطی "case "arak
برابر با مقدار بولین true
ارزیابی شده و از همین روی دستورات داخلی آن اجرا میشوند که در نتیجه استرینگ فوق در خروجی چاپ میشود و با اجرای دستور break
نیز مفسر از دستور switch
خارج میگردد. حال استرینگ مربوط به نام این شهر را به صورت «Arak» با حرف اول بزرگ وارد برنامه میکنیم و در خروجی خواهیم داشت:
Please Type the Name of the City: Arak
Sorry, This City Is Not Defined!
در واقع، زبان برنامهنویسی جاوا Case Sensitive بوده و به حروف بزرگ و کوچک حساس است که برای رفع چنین مشکلی و جلوگیری از مسائلی همچون بزرگ یا کوچک وارد کردن برخی از کاراکترهای مربوط به نام شهرها، میتوانیم تمامی کاراکترهای مربوطه را پس از دریافت از ورودی به حروف کوچک یا بزرگ تبدیل کرده و در برنامه مورد استفاده قرار دهیم.
در همین راستا، متد ()toLowerCase
را روی آبجکت ساختهشده از کلاس String
به نام cityName
فراخوانی میکنیم چرا که آبجکت cityName
استرینگ مربوط به نام شهر دریافتشده از ورودی را نگهداری کرده و فراخوانی این متد روی آبجکت مذکور منجر بدین میگردد تا تمامی کاراکترهای مربوط به استرینگ نام شهر به حروف کوچک تبدیل شوند. برای پیادهسازی این فیچر، کد فوق را به صورت زیر ریفکتور میکنیم:
import java.util.Scanner;
public class CityCode {
public static void main(String[] args) {
System.out.print("Please Type the Name of the City: ");
Scanner keyboardInput = new Scanner(System.in);
String cityName = keyboardInput.next();
cityName = cityName.toLowerCase();
switch (cityName) {
case "mashhad":
System.out.println("Mashhad Code Is 051");
break;
case "arak":
System.out.println("Arak Code Is 086");
break;
case "abadan":
System.out.println("Abadan Code Is 061");
break;
case "tehran":
System.out.println("Tehran Code Is 021");
break;
case "amol":
System.out.println("Amol Code Is 011");
break;
case "chabahar":
System.out.println("Chabahar Code Is 054");
break;
case "sanandaj":
System.out.println("Sanandaj Code Is 087");
break;
default:
System.out.println("Sorry, This City Is Not Defined!");
}
keyboardInput.close();
}
}
در کد فوق، متد ()toLowerCase
را روی آبجکت cityName
فراخوانی کرده و استرینگ ذخیرهشده در آن را به استرینگی با کاراکترهای کوچک تبدیل کرده و در سطر بعد نتیجۀ ریترنشده از فراخوانی متد مذکور را مجدداً به آبجکت cityName
منتسب میکنیم و بدین ترتیب مقدار جدید (استرینگی با کاراکترهای کوچک) جایگزین مقدار قبلیِ منتسب به آبجکت مذکور میشود. در ادامه مشابه آنچه که پیشتر توضیح دادیم، هر یک از کِیسهای مطرحشده در برنامه بررسی شده و کِیسی که استرینگ درجشده در مقابل آن با استرینگ منتسب به آبجکت cityName
برابر باشد، برقرار بوده و دستور مرتبط با آن اجرا میشود. به عنوان مثالی دیگر، استرینگ مربوط به نام شهر «chaBaHaR» را وارد برنامه میکنیم و در خروجی خواهیم داشت:
Please Type the Name of the City: chaBaHaR
Chabahar Code Is 054
با اجرای برنامۀ فوق، استرینگ «chaBaHaR» به آبجکت cityName
منتسب شده و فراخوانی متد ()toLowerCase
روی این آبجکت منجر بدین میگردد تا استرینگ جدیدی به صورت «chabahar» به آبجکت cityName
منتسب شده و مقدار قبلی آن پاک شود. در ادامه، هر یک از شرطهای case
بررسی شده و کِیس ششم برابر با مقدار بولین true
ارزیابی شده و دستورات داخلی آن اجرا میگردد که در نتیجه استرینگ مربوط به پیششمارۀ شهر چابهار در خروجی چاپ شده و با اجرای دستور break
در پایان این کِیس نیز مفسر از دستور switch
خارج میگردد.
حال برنامۀ فوق را مجدداً اجرا میکنیم و این بار استرینگ مربوط به نام شهری به غیر از استرینگهای تعریفشده در شروط case
را وارد برنامه مینماییم که در خروجی خواهیم داشت:
Please Type the Name of the City: yazd
Sorry, This City Is Not Defined!
همانطور که مشاهده میکنیم، با اجرای برنامۀ فوق هیچ یک از کِیسهای تعریفشده در برنامه برقرار نبوده و از همین روی دستور default
اجرا شده و منجر به چاپ استرینگ فوق در بخش کنسول میگردد.