JavaRush /مدونة جافا /Random-AR /طريقة charAt () في جافا

طريقة charAt () في جافا

نشرت في المجموعة
هناك العديد من التقنيات الأساسية التي نستخدمها بانتظام دون التفكير فيها. حسنًا، ماذا لو فكرت في الأمر ونظرت إلى كيفية تنفيذ بعض الأساليب التي تبدو بسيطة؟ أعتقد أن هذا سيساعدنا على الاقتراب خطوة واحدة من Java) charAt() في جافا - 1لنتخيل موقفًا نحتاج فيه إلى استخراج حرف معين من سلسلة ما. كيف يمكننا أن نفعل هذا في جافا؟ على سبيل المثال، عن طريق الاتصال بـ Java String charAt. charAt()سنتحدث عن الطريقة في مقال اليوم.

بناء الجملة

char charAt(int index)تقوم بإرجاع قيمة char في الفهرس المحدد. يتراوح المؤشر من 0 إلى length()-1. أي أن charالقيمة الأولى للتسلسل موجودة index 0، والقيمة التالية موجودة، index 1وما إلى ذلك، كما هو الحال مع فهرسة المصفوفة.

مثال

public static void main(String[] args) {
   System.out.print("JavaRush".charAt(0));
   System.out.print("JavaRush".charAt(1));
   System.out.print("JavaRush".charAt(2));
   System.out.print("JavaRush".charAt(3));
}
السطر الأول يأخذ الحرف الأول، والسطر الثاني يأخذ الثاني، وهكذا. نظرًا لأنه لا println، ولكن يتم استخدامه هنا print، بدون سطر جديد، فسنحصل على الإخراج التالي إلى وحدة التحكم:

Java
إذا charتم تمثيل الفهرس المحدد كـ Unicode، فستكون نتيجة الطريقة java charAt()هي الحرف الذي يمثل Unicode هذا:
System.out.println("J\u0061vaRush".charAt(1));
إخراج وحدة التحكم:

a

ما هو "تحت غطاء محرك السيارة"

كيف تعمل، أنت تسأل؟ charAt() في جافا - 2الحقيقة هي أن كل كائن Stringيحتوي على مصفوفة byteتحتوي على بايتات من عناصر سلسلة معينة:
private final byte[] value;
وهذه هي الطريقة نفسها chatAt:
public char charAt(int index) {
   if (isLatin1()) {
       return StringLatin1.charAt(value, index);
   } else {
       return StringUTF16.charAt(value, index);
   }
}
isLatin1- علامة تشير إلى ما إذا كانت سلسلتنا تحتوي على أحرف لاتينية فقط أم لا. يحدد هذا الأسلوب الذي سيتم استدعاؤه بعد ذلك.

isLatin1 = صحيح

إذا كانت السلسلة تحتوي على أحرف لاتينية فقط، فسيتم استدعاء أسلوب charAtالفئة الثابتة StringLatin1:
public static char charAt(byte[] value, int index) {
   if (index < 0 || index >= value.length) {
       throw new StringIndexOutOfBoundsException(index);
   }
   return (char)(value[index] & 0xff);
}
الخطوة الأولى هي التحقق من أن الفهرس الوارد أكبر من أو يساوي 0، وأنه لا يتجاوز مصفوفة البايت الداخلية، وإذا لم يكن الأمر كذلك، فسيتم طرح استثناء new StringIndexOutOfBoundsException(index). إذا تم تمرير الشيكات، فسيتم أخذ العنصر الذي نحتاجه. وفي النهاية نرى:
  • &يمتد للعملية الثنائية إلى bytebitwise
  • 0xffلا يفعل شيئا ولكن &يتطلب حجة
  • (char)تحويل البيانات من جدول ASCII إلىchar

isLatin1 = خطأ

إذا كان لدينا أكثر من مجرد أحرف لاتينية، فسيتم استخدام الفصل StringUTF16وسيتم استدعاء طريقته الثابتة:
public static char charAt(byte[] value, int index) {
   checkIndex(index, value);
   return getChar(value, index);
}
والذي يدعو بدوره:
public static void checkIndex(int off, byte[] val) {
   String.checkIndex(off, length(val));
}
ويفوض إلى طريقة ثابتة String:
static void checkIndex(int index, int length) {
   if (index < 0 || index >= length) {
       throw new StringIndexOutOfBoundsException("index " + index +
                                                 ", length " + length);
   }
}
هنا، في الواقع، يتم إجراء فحص لمعرفة ما إذا كان الفهرس صالحًا: مرة أخرى، ما إذا كان موجبًا أم صفرًا، وما إذا كان لم يتجاوز حدود المصفوفة. لكن في فصل دراسي StringUTF16ما، charAtسيكون استدعاء الطريقة الثانية أكثر إثارة للاهتمام:
static char getChar(byte[] val, int index) {
   assert index >= 0 && index < length(val) : "Trusted caller missed bounds check";
   index <<= 1;
   return (char)(((val[index++] & 0xff) << HI_BYTE_SHIFT) |
                 ((val[index]   & 0xff) << LO_BYTE_SHIFT));
}
لنبدأ بتحليل ما يحدث بالفعل هنا. الخطوة الأولى في بداية الطريقة هي التحقق من صحة الفهرس. لفهم ما سيحدث بعد ذلك، عليك أن تفهم: عندما يدخل حرف غير لاتيني إلى المصفوفة value، يتم تمثيله ببايتين (خليتان من المصفوفة). إذا كان لدينا سلسلة مكونة من حرفين سيريليين - "av"، فحينئذٍ:
  • بالنسبة لـ 'a'، هذا زوج من البايتات - 48 و4؛
  • لـ "في" - 50 و 4.
أي أننا إذا أنشأنا السلسلة "av"، فستحتوي على مصفوفة value- {48, 4, 50, 4} في الواقع، تعمل هذه الطريقة مع خليتين مصفوفتين value. ولذلك، فإن الخطوة التالية هي التحول index <<= 1;للوصول مباشرة إلى فهرس البايت الأول من الحرف المطلوب في المصفوفة value. الآن لنفترض أن لدينا سلسلة "абвг". بعد ذلك ستبدو مصفوفة القيم بالشكل التالي: {48، 4، 49، 4، 50، 4، 51، 4}. نطلب العنصر الثالث من السلسلة، ومن ثم يكون التمثيل الثنائي هو 00000000 00000011. عند الإزاحة بمقدار 1، نحصل على 00000000 00000110، أي index = 6. لتحديث معرفتك بعمليات البت، يمكنك قراءة هذه المقالة . charAt() في جافا - 4نرى أيضًا بعض المتغيرات: HI_BYTE_SHIFT في هذه الحالة هو 0. LO_BYTE_SHIFTوفي هذه الحالة هو 8. في السطر الأخير من هذه الطريقة:
  1. يتم أخذ العنصر من مصفوفة القيمة وإزاحته بمقدار HI_BYTE_SHIFT0، مع زيادة index +1.

    في المثال مع السلسلة "абвг"، البايت السادس - 51 - سيبقى كذلك، ولكن في نفس الوقت يزيد الفهرس إلى 7.

  2. بعد ذلك، يتم أخذ العنصر التالي من المصفوفة وإزاحته إلى اتجاه البت بنفس الطريقة، ولكن بمقدار LO_BYTE_SHIFT، أي بمقدار 8 بتات.

    وإذا كان لدينا بايت 4، الذي له تمثيل ثنائي - 00000000 00000100، فبعد التحويل بمقدار 8 بتات سيكون لدينا 00000100 00000000. إذا كان عددًا صحيحًا - 1024.

  3. بعد ذلك، بالنسبة لهاتين القيمتين، تتبع العملية | (OR).

    وإذا كان لدينا بايت 51 و1024، والتي تبدو في التمثيل الثنائي مثل 00000000 00110011 و00000100 00000000، فبعد العملية ORسنحصل على 00000100 00110011، وهو ما يعني الرقم 1075 في النظام العشري.

    حسنًا، في النهاية، يتم تحويل الرقم 1075 إلى نوع char، وعند التحويل int -> char، يتم استخدام جدول ASCII، وفيه، تحت الرقم 1075، يوجد الحرف "r".

في الواقع، هذه هي الطريقة التي نحصل بها على "g" كنتيجة للطريقة charAt()المستخدمة في برمجة Java.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION