در آموزش گذشته به پیادهسازی پروژهای به منظور دریافت دیتایی از نوع دادۀ 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 اجرا شده و منجر به چاپ استرینگ فوق در بخش کنسول میگردد.
