كيفية تحويل شار إلى سلسلة في Java (أمثلة)
⚡ ملخص ذكي
تحويل حرف إلى سلسلة نصية في Java يتطلب الأمر استدعاءً واحدًا للدالة String.valueOf(myChar) أو Character.toString(myChar). أما في الاتجاه المعاكس، فيتم استخدام الدالة charAt(index)، التي تستخرج حرفًا واحدًا من سلسلة نصية بناءً على موقعه.
في هذا الدرس، سندرس برنامجين قصيرين ينقلان قيمة بين طريقتين. Java يخزن النص:
- تحويل حرف إلى سلسلة نصية
- تحويل سلسلة نصية إلى حرف
النوعان غير قابلين للتبادل. الحرف (char) هو نوع بيانات أساسي يحتوي على وحدة ترميز UTF-16 واحدة فقط، مكونة من 16 بت، وتُكتب بين علامتي اقتباس مفردتين كـ 'g'. أما السلسلة النصية (String) فهي كائن يحتوي على سلسلة من وحدات الترميز هذه، وتُكتب بين علامتي اقتباس مزدوجتين كـ "Guru99 بوصة. ولأن أحدهما نوع بيانات أولي والآخر كائن، فلا يمكن لأي تحويل أن يربط بينهما - يجب أن تقوم دالة من المكتبة بهذه المهمة، و Java يُوفر واحداً لكل اتجاه.
تحويل شار إلى سلسلة
توجد طرق متعددة لتحويل حرف إلى سلسلة نصية في Javaداخلياً a Java يخزن String نصه تُعرَّف هذه البيانات على أنها مصفوفة من وحدات الترميز، ولهذا السبب يُمكن إدخال حرف واحد فيها بسهولة. الحرف هو نوع بيانات غير مُوقَّع ذو 16 بت، بعرض بايتين، ويحمل قيمًا من 0 إلى 65,535.
يمكننا تحويل حرف إلى سلسلة نصية باستخدام طريقتين: الطريقة الثابتة `toString()` في فئة `Character`، والطريقة الثابتة `valueOf()` في فئة `String`. تُعيد كلتا الطريقتين سلسلة نصية جديدة مكونة من حرف واحد، ويُظهر البرنامجان أدناه النتيجة نفسها.
الطريقة الأولى: استخدام طريقة toString ().
يقوم البرنامج أدناه بتخزين الحرف g في a متغير شار ثم يمررها إلى الدالة Character.toString()، التي تُعيد ذلك الحرف كسلسلة نصية. الكود قابل للتعديل، لذا غيّر الحرف وشغّله مرة أخرى لمشاهدة الناتج.
public class CharToString_toString {
public static void main(String[] args) {
//input character variable
char myChar = 'g';
//Using toString() method
//toString method take character parameter and convert string.
String myStr = Character.toString(myChar);
//print string value
System.out.println("String is: " + myStr);
}
}
الناتج المتوقع :
String is: g
الطريقة الثانية: استخدام طريقة valueOf ().
يقوم البرنامج الثاني باستبدال قيمة String.valueOf(myChar) فقط دون تغيير أي شيء آخر. Java 9 الاستدعاءان هما نفس العملية: يتم تنفيذ Character.toString(char) كاستدعاء لـ String.valueOf(char)، لذلك لا يوجد أي منهما أسرع بشكل ملحوظ من الآخر.
public class CharToString_valueOf {
public static void main(String[] args) {
char myChar = 'g';
//valueOf method take character parameter and convert string.
String myStr = String.valueOf(myChar);
////print string value
System.out.println("String is: " + myStr);
}
}
الناتج المتوقع :
String is: g
طرق أخرى لتحويل حرف إلى سلسلة نصية
تظهر أربع طرق أخرى في التعليمات البرمجية القديمة وفي أسئلة المقابلات. جميعها تعمل، لكن لا توجد طريقة واضحة مثل الطريقتين المذكورتين أعلاه، واثنان منها يخصصان مساحة أكبر من اللازم.
public class CharToStringMore { public static void main(String[] args) { char myChar = 'g'; // 1. concatenation with an empty literal String byConcat = myChar + ""; // 2. the Character wrapper instance method String byWrapper = Character.valueOf(myChar).toString(); // 3. a one-element array of code units String byArray = new String(new char[]{myChar}); // 4. the format() helper with the %c conversion String byFormat = String.format("%c", myChar); System.out.println(byConcat + byWrapper + byArray + byFormat); } }
الناتج المتوقع:
gggg
يوضح الجدول متى يكون استخدام كل مسار مجدياً.
| الأسلوب | مثال | ملاحظة |
|---|---|---|
| String.valueOf(char) | String.valueOf(myChar) | موصى به. مكالمة واحدة، لا يوجد كائن إضافي بخلاف السلسلة النصية المُعادة. |
| Character.toString(char) | Character.toString(myChar) | جيد بنفس القدر. متوفر منذ Java 1.4 ويفوض إلى String.valueOf منذ Java 9. |
| سلسلة | myChar + “” | الأعمال، وعلى Java في الإصدار 9 وما بعده، يتم تحويله إلى استدعاء دالة invokedynamic بدلاً من StringBuilder، لذا فإن التحذير القديم بشأن بطئه لم يعد صحيحاً. مع ذلك، لا يزال يخفي الغرض منه. |
| غلاف الشخصية | Character.valueOf(myChar).toString() | Boxقم بتعريف الحرف أولاً. استخدم Character.valueOf، وليس المُنشئ new Character(char)، الذي تم إهماله تمهيدًا لإزالته منذ ذلك الحين. Java 9. |
| مصفوفة الأحرف | سلسلة نصية جديدة (مصفوفة أحرف جديدة {myChar}) | يقوم بتخصيص مصفوفة ونسخها. احتفظ بها في حالة وجود مصفوفة أحرف لديك بالفعل. |
| تنسيق السلسلة | String.format(“%c”, myChar) | الأبطأ بكثير، لأن سلسلة التنسيق تُحلل أثناء التشغيل. لا فائدة منها إلا عندما يكون الحرف جزءًا من قالب أكبر. |
بعد تغطية كلا اتجاهي تحويل الحرف الواحد، تأتي العملية العكسية.
تحويل السلسلة إلى char
يمكننا تحويل سلسلة نصية إلى حرف باستخدام دالة charAt() الخاصة بفئة String. تأخذ هذه الدالة فهرسًا يبدأ من الصفر، وتعيد الحرف الموجود في ذلك الموضع، لذا فإن قراءة كل حرف تعني مرحاضping من 0 إلى طول () ناقص واحد. طلب فهرس أقل من 0 أو عند طول () وما فوق يُنتج استثناء StringIndexOutOfBoundsException.
البرنامج أدناه يتتبع السلسلة Guru99 موضعًا واحدًا في كل مرة ويطبع كل حرف مع فهرسه.
//Convert String to Character using string method
package com.guru99;
public class StringToChar {
public static void main(String[] args)
{
//input String
String myStr = "Guru99";
//find string length using length method.
int stringLength =myStr.length();
//for loop start 0 to total length
for(int i=0; i < stringLength;i++)
{
//chatAt method find Position and convert to character.
char myChar = myStr.charAt(i);
//print string to character
System.out.println("Character at "+i+" Position: "+myChar);
}
}
}
الناتج المتوقع:
Character at 0 Position: G Character at 1 Position: u Character at 2 Position: r Character at 3 Position: u Character at 4 Position: 9 Character at 5 Position: 9
لاحظ أنه لا يمكن تحويل نوع البيانات String ببساطة: char c = (char) myStr; لن يتم تجميع الكود، لأن String كائن بينما char نوع بيانات أولي. بالنسبة لسلسلة نصية معروفة مسبقًا بأنها تحتوي على حرف واحد فقط، فإن charAt(0) هو الحل الأمثل.
تحويل سلسلة نصية إلى مصفوفة أحرف والعكس
عندما تكون هناك حاجة إلى كل حرف دفعة واحدة بدلاً من فهرس واحد في كل مرة، فإن الدالة toCharArray() تُرجع قيمة. مصفوفة أحرف جديدة. تحويل تلك المصفوفة مرة أخرى إلى نص هو مهمة المُنشئ String(char[]) أو String.valueOf(char[])، وكلاهما ينسخ المصفوفة بشكل وقائي، بحيث لا تؤدي التعديلات اللاحقة على المصفوفة إلى تغيير السلسلة النصية.
public class StringCharArray { public static void main(String[] args) { String myStr = "Guru99"; // the text split into its array of code units char[] chars = myStr.toCharArray(); System.out.println(chars.length); System.out.println(chars[0]); // the array turned back into text System.out.println(new String(chars)); System.out.println(String.valueOf(chars)); // one range copied into an array you already own char[] part = new char[4]; myStr.getChars(0, 4, part, 0); System.out.println(new String(part)); } }
الناتج المتوقع:
6 G Guru99 Guru99 Guru
تقوم الطريقة الرابعة، getChars(srcBegin, srcEnd, dst, dstBegin)، بنسخ نطاق إلى مصفوفة موجودة لديك بالفعل بدلاً من إنشاء مصفوفة جديدة. فهرس النهاية غير حصري، ولهذا السبب تُرجع getChars(0, 4, part, 0) القيمة 0. Guru بدلا من Guru9. حدود خارج النطاق تؤدي إلى ظهور استثناء IndexOutOfBoundsException.
تختلف الأساليب الثلاثة بشكل رئيسي في ما تخصصه، كما هو ملخص أدناه.
| مهمة | اتصل | ما الذي يخصصه |
|---|---|---|
| تحويل سلسلة نصية إلى مصفوفة أحرف | myStr.toCharArray() | مصفوفة جديدة؛ آمنة على سلسلة نصية فارغة، حيث تُرجع مصفوفة ذات طول صفري. |
| تحويل مصفوفة الأحرف إلى سلسلة نصية | new String(chars) or String.valueOf(chars) | سلسلة نصية جديدة بالإضافة إلى نسخة داخلية من المصفوفة. |
| نطاق في مصفوفة موجودة | myStr.getChars(0, 4, part, 0) | لا جديد في الأمر؛ فهو يكتب في المصفوفة التي تُدخلها. |
الأخطاء الشائعة عند تحويل الأحرف والسلاسل النصية Java
معظم المشاكل في هذه التحويلات ناتجة عن ستة أخطاء متكررة، وليس عن الطرق نفسها. يوضح الجدول كل خطأ مع حله.
| المشكلة | سبب | حل |
|---|---|---|
| أنواع غير متوافقة: لا يمكن تحويل السلسلة النصية إلى حرف | محاولة تحويل نوع البيانات، مثل char c = (char) myStr; | استخدم myStr.charAt(0) بدلاً من ذلك. لا يوجد تحويل بين الكائن والنوع الأولي. |
| استثناء StringIndexOutOfBoundsException | يتم استدعاء الدالة charAt() بفهرس سالب، أو باستخدام الدالة length() على سلسلة نصية فارغة. | قم بالتحقق باستخدام isEmpty() أو قارن الفهرس مع length() قبل القراءة. |
| String.valueOf(null) throws NullPointerException | القيمة الفارغة المجردة تطابق دالة التحميل الزائد لـ char[]، وهي الأكثر تحديدًا. | اكتب String.valueOf((Object) null) عندما يكون النص الحرفي null هو ما تريده. |
| تُرجع الدالة Character.toString(65) الحرف A، وليس 65. | Java أضاف الإصدار 11 دالة Character.toString(int) المُحمّلة بشكل زائد والتي تقرأ وسيطها كنقطة رمز Unicode | استخدم String.valueOf(65) أو Integer.toString(65) للأرقام 65. |
| يظهر رمز تعبيري على شكل رمزين مشوشين | تشغل الأحرف التي تزيد عن U+FFFF خانتين، إحداهما رمز عالي والأخرى رمز منخفض. | اقرأ القيمة باستخدام codePointAt(0)، ثم أعد بناءها باستخدام Character.toString(codePoint) on Java 11 وما بعده. |
| تحذير بشأن إيقاف استخدام الدالة new Character(myChar) | تم إيقاف استخدام مُنشئ Character(char) منذ ذلك الحين Java 9 ومُعَلَّمة للإزالة | استخدم Character.valueOf(myChar)، أو دع خاصية التغليف التلقائي توفر الغلاف. |
تدعم فئة String نفسها العديد من التمارين المجاورة: عكس سلسلة نصية باستخدام التكرار, مقارنة سلسلتين نصيتينو مخرجات الطباعة المنسقة.
