الدرس 7 من 10
النصوص
- 13 دقيقة
- 6 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
المقارنة بـ equals بدل == والصنف StringBuilder
الشرح
النصّ كائن من الصنف String وله دوال كثيرة، منها length() وتُكتب هنا بأقواس، وcharAt(i) التي تُرجع الحرف الذي في الموضع i، وtrim() التي تحذف المسافات من الطرفين، وtoLowerCase() التي تحوّل الأحرف إلى صغيرة، وreplace(" ", "") التي تستبدل نصًّا بآخر، وsplit(" +") التي تقسم النصّ إلى مصفوفة عند كل مسافة أو أكثر. والنصّ لا يتغيّر أبدًا، فكل هذه الدوال تُرجع نصًّا جديدًا، ولذلك فإن name.trim(); وحدها لا تفعل شيئًا.
وأشهر فخّ في Java أن == بين نصّين تسأل «هل هما الكائن نفسه؟» ولا تسأل «هل حروفهما واحدة؟»، فقد تعطيك النتيجة الصحيحة مع النصوص المكتوبة في الكود، ثم تخطئ مع نصّ أدخله المستخدم أو بُني أثناء التشغيل. ولذلك قارن المحتوى دائمًا بـ a.equals(b)، أو بـ equalsIgnoreCase إذا أردت أن تتجاهل الفرق بين الأحرف الكبيرة والصغيرة.
ولأن النصّ لا يتغيّر، فإن وصله بـ += داخل حلقة يبني نصًّا جديدًا في كل دورة، أما StringBuilder فنصّ يمكن تعديله، تضيف إليه بـ append، وتعكسه نفسه بـ reverse()، ثم تحصل على النصّ النهائي بـ toString().
المطلوب
اكتب samePlayer(a, b) لتُرجع true إذا كان الاسمان متطابقين، مع تجاهل الفرق بين الأحرف الكبيرة والصغيرة والمسافات حول الاسمين، وreverseWords(s) لتعكس ترتيب الكلمات باستعمال StringBuilder وتضع بينها مسافة واحدة مهما كثرت المسافات في الأصل، وisPalindrome(s) لتُرجع true إذا كان النصّ يُقرأ من أوله ومن آخره بالشكل نفسه، مع تجاهل حالة الأحرف والمسافات. ثم اطبع من main ناتج reverseWords("Java runs Minecraft").
الفحوص
6 فحوص- الدالة samePlayer تقارن الحروف بـ equals وليس بـ ==
- الدالة samePlayer تتجاهل حالة الأحرف والمسافات حول الاسم
- الدالة reverseWords تعكس ترتيب الكلمات
- الدالة reverseWords تضع مسافة واحدة مهما كثرت المسافات
- الدالة isPalindrome تتجاهل حالة الأحرف والمسافات
- طُبع Minecraft runs Java