/Java Programming: Let's Master 8/i

Java Programming: Let's Master 8/i

Chapter 8 – Strings & Text I-O

8.1. Introduction

النهاردة معادنا في شابتر سهل أول وممتع ومهم،، هنتكلم فيه عن كل ما يخص الـ Strings والـCharacters  وهنغطي كمان جزء الـ Text I/O أو ما يسمى بقراءة وإدخال النصوص إن صحّت الترجمة، حيث لا أميل لترجمة المصطلحات دي بالعربية.. المهم

في البداية طبعا عاوزين نعرف يعني ايه string ؟؟

هو عبارة عن تسلسل من الحروف. في معظم لغات البرمجة بيعامل الـ string معاملة الarray of chars ولكن في الجافا بنعامل الـ string معاملة ال object . فيه عندنا تلات كلاسات بيتعاملوا مع الـ string وهما :

String, StringBuilder, and StringBuffer

لو التعامل هيبقي فقط لتخزين والتعامل مع الـ string في الحالة دي كلاس الـ String اختيار موفق ولكنه مش بيسمح بالتعديل علي الـ string . في حالة استخدامنا للكلاسين التانيين StringBuilder & StringBuffer نقدر نعمل strings ونقدر نعدلهم والتعامل هيبقي مرن .

8.2. The String Class

كلاس java.lang.String بيكون string من تسلسل مجموعة من الحروف. احنا اتعاملنا قبل كده مع المتغير اللي من نوع String زي مثلا ميثود println(String s) والـ compiler بياخد الـ string variable وبيقوم محوله لـ string object وبيتعامل معاه علي الأساس ده.

كلاس الـ String بيحتوي علي 11 constructor واكتر من اربعين ميثود بيعملوا وظائف متعددة زي مقارنة محتويات الـ strings والبحث عن string معين داخل string ووالتعامل مع الناتج الجديد وتحويل الحروف من حالة ال capital لحالة الـ small او من الـ uppercase للـ lowercase .

8.2.1. Constructing a String

طيب ازاي اعمل   String object؟

عندنا اربع طرق كلهم بيعملوا string جديد

1-    اول طريقة هتعامل مع الـ string علي انه object وبخلقه زي اي object :

2-    تاني طريقة اني اديله الـ stringLiteral علطول :

3-    تالت طريقة اني اعامل الـ string عادي كأنه متغير عادي (ودي الطريقة الشائعة):

4-    اخر طريقة اني اعرفه علي انه array زي كده

ملحوظة ::

فيه فرق بين String variable , String object , String value ولكن لأن الفروق بسيطة جدا فحاليا هنتعامل معاهم علي انهم واحد ونتجاهل الفروق دي مؤقتا وهنستخدم كلمة string بدل منهم.

8.2.2. Immutable Strings and Interned Strings

كلمة immutable string معناها انه لا يمكن تغييره او تعديله مثلا لو كتبنا الكود ده ياتري قيمة الString هتتغير؟؟

الإجابة هي لأ القيمة مش هتتغير. الجملة الأولي هتخلق String object وتحط فيه قيمة “java” وتدي الـ Reference بتاعه للمتغير s وفي الجملة التانية هييجي يحط القيمة الجديدة في نفس المتغير مش هينفع زي مااحنا شايفين:

لأن الـ String قيمته مش بتتغير الجافا بتوفر طريقة لتوفير استهلاك الـ memory  عن طريق استخدام ميثود اسمها intern() زي كده :

النتيجة هتبقي كده:

هنلاقي ان s, s2, s3 كلهم عبارة عن interned string فكلهم ساووا بعض لكن s1 لما قارناها بـ s طلعت مش بتساويها لأنهم اتنين objects مختلفين مع انهم بيحملوا نفس القيمة.

8.2.3. String Comparisons

احيانا بنحتاج نقارن قيمة اتنين string ببعض بإستخدام (==) :

ولكن الطريق دي بتشوف هل string1 و string2 بيشاوروا علي نفس الـ object ولا لأ. علشان نقارن بين القيم اللي بداخل string1 و string2 بنستخدم ميثود اسمها equals زي كده

ملحوظة::

مش معني ان اتنين strings بيحملوا نفس القيمة انهم يبقوا بيشوروا علي نفس الـ object ممكن يبقوا بيحملوا نفس القيمة ولكن كل واحد بيحمل reference لـ object مختلف عن التاني زي كده

في اول جملة هيبقي الناتج false لأنهم بيحملوا reference لأتنين object مختلفين ولكن في الجملة التانية هترجع true لأنهم بيحملوا فعلا نفس القيمة وهي “Welcome to Java” .

فيه برده ميثود اسمها compareTo ودي بتقارن بين اتنين string وبتبقي زي كده :

الميثود دي بترجع 0 لو s1 بيساوي s2 وبترجع قيمة اقل من 0 لو s1 اقل من s2 وبترجع قيمة اكبر من 0 لو s1 اكبر من s2  .

ونلاحظ برده ان نتيجة المقارنة بتعتمد علي ترتيب الحروف الأبجدي نفسه يعني بفرض ان عندنا s1 فيه “abc” وعندنا s2 فيه “abg” نتيجة المقارنة هتبقي -4 . هنيجي نقارن اول حرف من s1 واول حرف من s2 اللي هو “a” هيطلع متساويين فيه وبالمثل في التاني ولكن في الحرف التالت هنلاحظ  ان في ترتيب الحروف ال”c” بتقل عن ال”g” بـ 4 حروف فالنتيجة هتطلع -4 .

تنبيه:: يرجي عدم استخدام علامات المقارنة العادية (<,>,<=,>=) في حالة الـ String ولكن يتم استخدام ميثود compareTo فقط.

برده فيه ميثودس كتير ممكن نحتاجها زي equalsIgnoreCase بتقارن ولكن بتتجاهل حالة الحروف من حيث انهم uppercase او lowercase وميثود regionMatches بتقارن جزء فقط من الـ string وليس الstring كله وفيه برده ميثود str.startsWith(prefix) بتختبر هل الـ string ده بيبتدي بالقيمة الفلانية ولا لأ وميثود str.endsWith(suffix) بتختبر هل الـ string ده بينتهي بالقيمة الفلانية ولا لأ.

8.2.4. String Length and Retrieving Individual Characters

من الممكن معرفة طول الـ string عن طريق استخدام ميثود length() زي message.length() ودي بترجع طول الـ string .

ميثود تانية s.charAt(index) بترجع حرف معين من الـ String والـ index بيكون رقم بين الـ 0 وبين s.length() – 1 يعني message.charAt(0) هترجع “w” زي كده :

تنبيه :: لازم نراعي ان الـ index بيبقي اقصي قيمة ليه هي s.length()-1 وده لأن الـ index في حالة الـ string بيبدأ من 0 ومش من 1ولو كتبناها s.length() بس هيطلع StringIndexOutOfBoundsException  .

ملحوظة :: ميثود length موجودة اصلا في الـ array  وبنستخدمها هنا لنفس السبب ولكن هنا بنقول s.length()  وبترجع عدد الحروف في الـ string وفي حالة الـ array بنقول a.length وبترجع عدد العناصر في الـ array.

8.2.5. String Concatenation

ممكن نستخدم ميثود concat لدمج اتنين string زي كده:

وممكن برده الطريقة دي:

String myString = message + ” and ” + “HTML” ;

ونقدر نستخدم + لنفس الغرض لدمج اكتر من string مع بعض والأرقام كمان وفي حالة الأرقام بيتحول الرقم لـ string وبعد كده يندمج مع الـ string الأصلي ولازم نراعي ان في المعادلة دي لازم اي طرف يكون نوعه string وإلا الدمج مش هيتم.

8.2.6. Obtaining Substrings

احنا استخدمنا ميثود charAt() لإسترجاع حرف من string ولكن لو عاوزين نرجع اكتر من حرف بنستخدم ميثود substring وبيبقي ليها شكلين :

–         public String substring(int beginIndex, int endIndex

بترجع string جديد عبارة عن جزء مقتطع من الـ string الأصلي وبحددله بداية التقطيع beginIndex ونهايته endIndex زي المثال ده :

–         التقطيع والنهاية بتبقي لنهاية الـ string زي كده :

والنتيجة هتكون كده:    “Welcome to HTML”

8.2.7. String Conversions

صحيح ان بمجرد عمل الـ string مش بقدر اعدل في قيمته لكن اقدر اعمل string جديد بإستخدام toLowerCase, toUpperCase, trim, and replace كلهم بيرجعوا String جديد  :

–         toLowerCase, toUpperCase بيرجعوا String جديد بتتبدل فيه حروف الأصلي سواء من الupper لل lower او العكس.

–         trim بتشيل اي مساحات بين الحروف .

–         replace بتبدل اي حرف في كل مرة وجوده بحرف تاني

8.2.8. Finding a Character or a Substring in a String

ممكن نستخدم ميثودس زي indexOf  و  lastIndexOfللبحث عن حرف او مجموعة حروف بداخل اي string .فيه عندنا اربع صور لميثود indexOf() وميثود lastIndexOf():

بترجع الـ index بتاع الحرف ch لو ظهر مرة واحدة بس والindex بتاع اخر ظهور للحرف في حالة تكراره وبترجع -1 في حالة عدم وجود الحرف نهائي وبنستخدمها كده مثلا indexOf(‘a’) .

بترجع الـ index بتاع الحرف من اول الـ fromIndex

بترجع الـ index بتاع اول حرف في str في حالة وجوده مرة واحدة فقط واخر index لأول حرف في حالة تكرار الstr كله وبيرجع -1 في حالة عدم وجود Str
/p>

بترجع الـ index بتاع اول حرف في str من اول fromIndex .

امثلة :

8.2.9. Conversion Between Strings and Arrays

الـ string  مش array ولكن ممكن احوله لـ array والعكس صحيح. علشان احول من String لـ array بنستخدم ميثود toCharArray زي كده :

هيبقي عندنا chars[0]=”J” , chars[1]=”a”, chars[2]=”v”, chars[3]=”a”

لو عاوزين نحول من array لـ string هنستخدم الـ constructor ده String(char[]) :

أو

8.2.10. Converting Characters and Numeric Values to Strings

علشان نقدر نحول اي قيمة عددية لـ string بنستخدم الميثود المناسبة لنوع القيمة العددية يعني مثلا Double.parseDouble(str) بنستخدمها في حالة المتغير اللي من نوع Double وميثود Integer.parseInt(str) في حالة المتغير اللي من نوع int .

8.2.11. Example: Checking Palindromes

مثال عندنا ده برنامج بيختبر اي string هل هو palindrome ولا لأ؟

الـ string بيكون palindrome لو اتقري من اليمين زي الشمال زي مثلا “mom” او “dad” او “noon”

لو جينا نفكر في فكرة للبرنامج اول حاجة عمل متغيرين low و high عبارة عن index اول واخر حرف في الـ string ومبدئيا low قيمته 0 والـ high قيمته s.length()-1 وبيقارن الـ low مع الـ high لو هما نفس الحرف بيزود الـ low بواحد ويقلل الـ high بواحد ويقارنهم تاني وهكذا لحد اخر الString وبنطلع من اللووب لو الـlow بقي اكبر من الـ high او في حالة ان الحرفين مختلفين.

احنا لحد هنا نكون اتعرفنا على كلاس String و StringBuilder وعرفنا أهم عمليات المعالجة اللي ممكن تتم على String أو charArray

في النهاية عايز أوضح ان الجافا بتتعامل مع الString على انه أوبجكت وبتعتبره reference dataType ..

ومعادنا المرة الجاية ان شاء الله نتكلم عن كلاس Character والجزء الخاص بـ Text I/O..

It’s totally free to share

Thanks, CATReloaded

Thanks, CATaZine

Om4rezz