رشتهها که در برنامهنویسی جاوا بهطور گسترده استفاده میشوند، توالی از کاراکترها هستند. در زبان برنامهنویسی جاوا، رشتهها اشیا هستند.
پلتفرم جاوا کلاس String را برای ایجاد و دستکاری رشتهها فراهم میکند.
مستقیمترین راه برای ایجاد رشته، نوشتن این است:
String greeting = "Hello world!";
در این مورد، "Hello world!" یک String Literal (رشتهٔ تحتلفظی) است — سری کاراکترها در کد شما که داخل دوگانههای دوتایی محصور شده. هرگاه کامپایلر String Literal را در کد شما ببیند، شیء Stringای با مقدارش ایجاد میکند — در این مورد، Hello world!.
مانند هر شیء دیگری، میتوانید اشیای String را با استفاده از کلمهٔ کلیدی new و Constructor ایجاد کنید. کلاس String سیزده Constructor دارد که اجازه میدهد مقدار اولیهٔ رشته را از منابع مختلف فراهم کنید، مانند آرایهٔ کاراکترها:
char[] helloArray = { 'h', 'e', 'l', 'l', 'o', '.' };
String helloString = new String(helloArray);
IO.println("String: " + helloString);
خروجی:
String: hello
نکته: کلاس---Stringغیرقابل تغییر (Immutable) است. بنابراین پس از ایجاد، شیءStringنمیتواند تغییر کند. کلاسStringMethodهای متعددی دارد که برخی آنها در ادامه بررسی میشوند و به نظر میرسد رشتهها را تغییر میدهند. از آنجا که رشتهها Immutable هستند، آنچه این Methodها واقعاً انجام میدهند ایجاد و برگرداندن رشتهٔ جدیدی حاوی نتیجهٔ عملیات است.
Methodهایی که برای دریافت اطلاعات دربارهٔ یک شیء استفاده میشوند Accessor Method نامیده میشوند. یک Accessor Method که میتوانید با رشتهها استفاده کنید Method length() است که تعداد کاراکترهای موجود در شیء رشته را برمیگرداند. پس از اجرای دو خط کد زیر، length برابر با ۱۷ است:
String palindrome = "Dot saw I was Tod";
int length = palindrome.length();
Palindrome کلمه یا جملهای است که متقارن است — از جلو و عقب به یک شکل نوشته میشود (با نادیدهگرفتن حروف بزرگ و کوچک و نشانهگذاری). در اینجا برنامهای کوتاه و ناکارآمد برای معکوسسازی رشتهٔ Palindrome آورده شده. این برنامه از Method charAt(i) استفاده میکند که کاراکتر i-ام رشته را با شمارش از ۰ برمیگرداند.
String palindrome = "Dot saw I was Tod";
int len = palindrome.length();
char[] tempCharArray = new char[len];
char[] charArray = new char[len];
// قرار دادن رشتهٔ اصلی در آرایهٔ کاراکترها
for (int i = 0; i < len; i++) {
tempCharArray[i] =
palindrome.charAt(i);
}
// معکوس کردن آرایهٔ کاراکترها
for (int j = 0; j < len; j++) {
charArray[j] =
tempCharArray[len - 1 - j];
}
String reversePalindrome = new String(charArray);
IO.println("Original string: " + palindrome);
IO.println("Reversed: " + reversePalindrome);
خروجی:
doT saw I was toD
برای انجام معکوسسازی رشته، برنامه مجبور شد رشته را به آرایهٔ کاراکترها تبدیل کند (حلقهٔ for اول)، آرایه را در آرایهٔ دومی معکوس کند (حلقهٔ for دوم) و سپس مجدداً به رشته تبدیل کند. کلاس String Method getChars() دارد که رشته یا بخشی از رشته را به آرایهٔ کاراکترها تبدیل میکند. بنابراین میتوانیم حلقهٔ for اول برنامه را با این جایگزین کنیم:
palindrome.getChars(0, len, tempCharArray, 0);
---
کلاس String Method String.concat() برای اتصال دو رشته دارد:
string1.concat(string2);
رشتهٔ جدیدی برمیگرداند که string1 با string2 الحاقشده در انتهای آن است.
میتوانید Method concat() را با String Literals نیز استفاده کنید:
"My name is ".concat("Rumplestiltskin");
رشتهها معمولاً با عملگر + متصل میشوند:
"Hello," + " world" + "!"
که نتیجه آن:
"Hello, world!"
عملگر + در دستورات چاپ بهطور گسترده استفاده میشود:
String string1 = "saw I was";
IO.println("Dot " + string1 + " Tod");
خروجی:
Dot saw I was Tod
چنین اتصالی میتواند ترکیبی از هر نوع شیء باشد. برای هر شیئی که String نباشد، Method toString() آن برای تبدیل به String فراخوانی میشود.
نکته: تا Java SE 15، زبان جاوا به String Literals اجازه نمیداد در فایلهای منبع از خطی به خط دیگر امتداد یابند. بنابراین باید در رشتههای چندخطی از عملگر اتصال + در انتهای هر خط استفاده میکردید. برای مثال:
String quote =
"Now is the time for all good " +
"men to come to the aid of their country.";
شکستن رشتهها بین خطوط با عملگر اتصال + در دستورات print بسیار رایج است.
از Java SE 15 به بعد، میتوانید String Literalهای دوبعدی به نام Text Blocks بنویسید. یک String Literal دوبعدی باید با سهگانههای دوتایی (""") شروع شود که بلافاصله با یک Line Terminator دنبال شود. برای بستن آن، یک سهگانهٔ دوتایی دیگر اضافه کنید:
String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
IO.println(html);
خروجی:
<html>
<body>
<p>Hello, world</p>
</body>
</html>
---
.Methodهای printf() و format() را برای چاپ خروجی با اعداد قالببندیشده دیدید. کلاس String Method کلاسی معادل به نام format() دارد که شیء String (نه PrintStream) برمیگرداند.
استفاده از Method Static format() کلاس String به شما اجازه میدهد رشتهٔ قالببندیشدهای بسازید که قابل بازاستفاده باشد، برخلاف یک دستور چاپ یکبار مصرف.
کد زیر را در نظر بگیرید — که از Text Block نیز استفاده میکند. کاراکتر \\s فاصلهٔ خالی انتهای خط را حفظ میکند و کاراکتر \\ مانع درج کاراکتر خط جدید در Text Block نتیجه میشود:
String format = """
The value of the float \
variable is %f, \s
while the value of the \
integer variable is %d, \s
and the string is %s.""";
var floatVar1 = 3.14f;
var intVar1 = 314;
var stringVar1 = "314";
IO.println(String.format(format, floatVar1, intVar1, stringVar1));
var floatVar2 = 2.72f;
var intVar2 = 272;
var stringVar2 = "272";
IO.println(String.format(format, floatVar2, intVar2, stringVar2));
خروجی:
The value of the float variable is 3.140000,
while the value of the integer variable is 314,
and the string is 314.
The value of the float variable is 2.720000,
while the value of the integer variable is 272,
and the string is 272.
---
اغلب، برنامهای با دادهٔ عددی در شیء رشته مواجه میشود — مثلاً مقداری که کاربر وارد کرده.
زیرکلاسهای Number که انواع عددی Primitive را بستهبندی میکنند (Byte، Integer، Double، Float، Long و Short) هرکدام Method کلاسی به نام valueOf() دارند که رشته را به شیء آن نوع تبدیل میکند. در اینجا مثالی آورده شده که دو رشته را از خط فرمان دریافت، به عدد تبدیل و عملیات حسابی انجام میدهد:
void arithmetic(String s1, String s2) {
// تبدیل رشتهها به اعداد
float a = (Float.valueOf(s1)).floatValue();
float b = (Float.valueOf(s2)).floatValue();
// انجام محاسبات
IO.println("a + b = " + (a + b));
IO.println("a - b = " + (a - b));
IO.println("a * b = " + (a * b));
IO.println("a / b = " + (a / b));
IO.println("a % b = " + (a % b));
}
arithmetic("4.5", "87.2");
خروجی:
a + b = 91.7
a - b = -82.7
a * b = 392.4
a / b = 0.051605508
a % b = 4.5
نکته: هر یک از زیرکلاسهایNumberهمچنین MethodparseXXXX()دارد. برای مثال،parseFloat()برای تبدیل رشتهها به اعداد اولیه قابل استفاده است. چون نوع Primitive (نه شیء) برگردانده میشود،parseFloat()مستقیمتر ازvalueOf()است:
float a = Float.parseFloat(s1);
float b = Float.parseFloat(s2);
---
گاهی نیاز دارید عددی را به رشته تبدیل کنید چون باید روی مقدار آن در فرم رشتهای عملیات انجام دهید. راههای سادهٔ متعددی برای تبدیل عدد به رشته وجود دارد:
int i;
// الحاق "i" با رشتهٔ خالی؛ تبدیل خودکار انجام میشود
String s1 = "" + i;
یا:
// Method کلاسی valueOf
String s2 = String.valueOf(i);
هر یک از زیرکلاسهای Number Method کلاسی toString() دارد که نوع Primitive خود را به رشته تبدیل میکند:
int i;
double d;
String s3 = Integer.toString(i);
String s4 = Double.toString(d);
مثال زیر Method toString() را برای تبدیل عدد به رشته و سپس Methodهای رشته برای محاسبهٔ تعداد ارقام قبل و بعد از نقطهٔ اعشار استفاده میکند:
double d = 858.48;
String s = Double.toString(d);
int dot = s.indexOf('.');
IO.println(dot + " digits before decimal point.");
IO.println( (s.length() - dot - 1) + " digits after decimal point.");
خروجی:
3 digits before decimal point.
2 digits after decimal point.
---
کلاس String Methodهای متعددی برای بررسی محتوای رشتهها، یافتن کاراکترها یا زیررشتهها، تغییر Case و سایر کارها دارد.
با فراخوانی Method charAt() میتوانید کاراکتر در ایندکس خاصی را دریافت کنید. ایندکس اولین کاراکتر ۰ و ایندکس آخرین کاراکتر length() - 1 است:
String palindrome = "Niagara. O roar again!";
char charAtIndex9 = palindrome.charAt(9);
IO.println("Palindrome: " + palindrome);
IO.println("Char at index 9: " + charAtIndex9);
خروجی:
Palindrome: Niagara. O roar again!
Char at index 9: O
[تصویر: ایندکسهای کاراکتر در رشته — نمایش موقعیت هر کاراکتر در "Niagara. O roar again!"]
اگر بخواهید بیش از یک کاراکتر متوالی از رشته دریافت کنید، از Method String.substring() استفاده کنید. دو نسخه دارد:
String substring(int beginIndex, int endIndex): رشتهٔ جدیدی که زیررشتهای از این رشته است برمیگرداند. زیررشته از beginIndex شروع و تا کاراکتر در ایندکس endIndex - 1 ادامه دارد.String substring(int beginIndex): رشتهٔ جدیدی که زیررشتهای از این رشته است برمیگرداند. زیررشته از beginIndex تا انتهای رشتهٔ اصلی ادامه دارد.مثال — استخراج کلمهٔ "roar" از Palindrome Niagara:
String palindrome = "Niagara. O roar again!";
String roar = palindrome.substring(11, 15);
IO.println("Palindrome: " + palindrome);
IO.println("Substring from 11 to 15: " + roar);
خروجی:
Palindrome: Niagara. O roar again!
Substring from 11 to 15: roar
[تصویر: استخراج کاراکترها از رشته با substring]
---String[] split(String regex) و String[] split(String regex, int limit): بر اساس رشتهٔ آرگومان (حاوی Regex) جستجو کرده و این رشته را به آرایهای از رشتهها تقسیم میکند. آرگومان عددی اختیاری حداکثر اندازهٔ آرایهٔ بازگشتی را مشخص میکند.CharSequence subSequence(int beginIndex, int endIndex): توالی کاراکتری جدیدی از ایندکس beginIndex تا endIndex - 1 میسازد.String trim(): کپیای از این رشته با حذف فاصلههای خالی ابتدایی و انتهایی برمیگرداند.String toLowerCase() و String toUpperCase(): کپیای از این رشته تبدیلشده به حروف کوچک یا بزرگ برمیگرداند.کلاس String Methodهای جستجوی زیر را ارائه میدهد. Methodهای indexOf() از ابتدا و Methodهای lastIndexOf() از انتهای رشته جستجو میکنند. اگر کاراکتر یا زیررشته یافت نشود، -1 برمیگردانند.
int indexOf(int ch) و int lastIndexOf(int ch): ایندکس اولین (آخرین) وقوع کاراکتر مشخصشده.int indexOf(int ch, int fromIndex) و int lastIndexOf(int ch, int fromIndex): ایندکس اولین (آخرین) وقوع کاراکتر مشخصشده با جستجو از ایندکس مشخصشده.int indexOf(String str) و int lastIndexOf(String str): ایندکس اولین (آخرین) وقوع زیررشتهٔ مشخصشده.boolean contains(CharSequence s): اگر رشته حاوی توالی کاراکتری مشخصشده باشد true برمیگرداند.نکته:---CharSequenceInterfaceای است که کلاسStringآن را پیادهسازی میکند. بنابراین میتوانید String را بهعنوان آرگومان Methodcontains()استفاده کنید.
کلاس String Methodهای زیر برای جایگزینی کاراکترها یا زیررشتهها دارد:
String replace(char oldChar, char newChar): جایگزینی تمام وقوعهای oldChar با newChar.String replace(CharSequence target, CharSequence replacement): جایگزینی هر زیررشته که با توالی هدف Literal مطابقت دارد.String replaceAll(String regex, String replacement): جایگزینی هر زیررشته که با Regex دادهشده مطابقت دارد.String replaceFirst(String regex, String replacement): جایگزینی اولین زیررشته که با Regex دادهشده مطابقت دارد.مثال زیر استفاده از lastIndexOf() و substring() را برای جداسازی بخشهای مختلف یک نام فایل نشان میدهد.
نکته: Methodهای کلاس Filename زیر هیچ بررسی خطایی انجام نمیدهند و فرض میکنند آرگومانشان شامل مسیر کامل پوشه و نام فایل با پسوند است.
class Filename {
String fullPath;
char pathSeparator, extensionSeparator;
Filename(String str, char sep, char ext) {
fullPath = str;
pathSeparator = sep;
extensionSeparator = ext;
}
String extension() {
int dot = fullPath.lastIndexOf(extensionSeparator);
if (dot == -1) {
return ""; // نقطه یافت نشد
} else {
return fullPath.substring(dot + 1);
}
}
// دریافت نام فایل بدون پسوند
String filename() {
int dot = fullPath.lastIndexOf(extensionSeparator);
int sep = fullPath.lastIndexOf(pathSeparator);
if (dot == -1) { // بدون پسوند
return fullPath.substring(sep + 1);
} else {
return fullPath.substring(sep + 1, dot);
}
}
String path() {
int sep = fullPath.lastIndexOf(pathSeparator);
return fullPath.substring(0, sep);
}
}
String path = "/home/user/index.html";
Filename myHomePage = new Filename(path, '/', '.');
IO.println("Extension = " + myHomePage.extension());
IO.println("Filename = " + myHomePage.filename());
IO.println("Path = " + myHomePage.path());
خروجی:
Extension = html
Filename = index
Path = /home/user
Method extension() از lastIndexOf() برای یافتن آخرین نقطه (.) در نام فایل استفاده میکند. سپس substring() با استفاده از مقدار بازگشتی lastIndexOf() پسوند نام فایل را استخراج میکند — یعنی زیررشته از نقطه تا انتهای رشته.
اگر نام فایل نقطه نداشته باشد، lastIndexOf() مقدار -1 برمیگرداند و Method extension() رشتهٔ خالی برمیگرداند.
کلاس String Methodهای متعددی برای مقایسهٔ رشتهها دارد:
boolean endsWith(String suffix) و boolean startsWith(String prefix): اگر رشته به ترتیب با زیررشتهٔ مشخصشده ختم یا شروع شود true برمیگرداند.boolean startsWith(String prefix, int offset): رشته را از ایندکس offset در نظر میگیرد.int compareTo(String anotherString): دو رشته را لغوی مقایسه میکند. عدد صحیحی برمیگرداند که مشخص میکند آیا این رشته بزرگتر (> ۰)، مساوی (= ۰) یا کوچکتر (< ۰) از آرگومان است.int compareToIgnoreCase(String str): مانند compareTo اما با نادیدهگرفتن تفاوت Case.boolean equals(Object anObject): فقط در صورتی true برمیگرداند که آرگومان شیء Stringای باشد که همان توالی کاراکترها را نمایش دهد.boolean equalsIgnoreCase(String anotherString): مانند equals اما با نادیدهگرفتن تفاوت Case.boolean regionMatches(...): آیا منطقهٔ مشخصی از این رشته با منطقهٔ مشخصی از رشتهٔ دیگر مطابقت دارد.boolean matches(String regex): آیا این رشته با Regex مشخصشده مطابقت دارد.مثال زیر Method regionMatches() را برای جستجوی رشتهای در رشتهٔ دیگر استفاده میکند:
String searchMe = "Green Eggs and Ham";
String findMe = "Eggs";
int searchMeLength = searchMe.length();
int findMeLength = findMe.length();
boolean foundIt = false;
for (int i = 0;
i <= (searchMeLength - findMeLength);
i++) {
if (searchMe.regionMatches(i, findMe, 0, findMeLength)) {
foundIt = true;
IO.println(searchMe.substring(i, i + findMeLength));
break;
}
}
if (!foundIt)
IO.println("No match found.");
خروجی:
Eggs
---
الگوهای مختلفی برای ایجاد رشتهها وجود دارد:
// String Literal
String greeting = "Hello world!";
IO.println("Greeting: " + greeting);
// از آرایهٔ کاراکترها
char[] helloArray = {'h', 'e', 'l', 'l', 'o', '.'};
String helloString = new String(helloArray);
IO.println("From array: " + helloString);
// رشتهٔ خودتان را بسازید!
String myString = "Your message here";
IO.println("My string: " + myString);
خروجی:
Greeting: Hello world!
From array: hello.
My string: Your message here
راههای مختلفی برای اتصال رشتهها وجود دارد:
روش اول: استفاده از عملگر +
var duke = "Duke";
var loves = "loves";
var java = "Java";
var sentence = duke + " " + loves + " " + java;
IO.println(sentence);
Duke loves Java
روش دوم: استفاده از concat()
var duke = "Duke";
var loves = "loves";
var java = "Java";
var sentence =
duke.concat(" ")
.concat(loves)
.concat(" ")
.concat(java);
IO.println(sentence);
Duke loves Java
روش سوم: ترکیب انواع مختلف
var name = "Duke";
var age = 30;
var sentence = name + " is " + age;
var length = sentence.length();
IO.println("length = " + length);
IO.println(sentence);
length = 10
Duke is 30
با charAt() کاراکترها و با substring() زیررشتهها را استخراج کنید:
var sentence = "Duke loves Java!";
char firstChar = sentence.charAt(0);
char lastChar = sentence.charAt(sentence.length() - 1);
IO.println("The first char is: " + firstChar);
IO.println("The last char is: " + lastChar);
The first char is: D
The last char is: !
var sentence = "Duke loves Java!";
var length = sentence.length();
IO.println("length = " + length);
var duke = sentence.substring(0, 4);
IO.println("Substring 1 = " + duke);
var java = sentence.substring(11, 15);
IO.println("Substring 2 = " + java);
length = 16
Substring 1 = Duke
Substring 2 = Java
با indexOf() زیررشته جستجو کنید:
var sentence = "Duke loves Java!";
int index = sentence.indexOf("Java");
IO.println("Index of Java: " + index);
Index of Java: 11
اگر رشتهٔ مورد جستجو چندین بار وجود دارد، از الگوی زیر استفاده کنید:
var sentence = "Duke loves Java, duke loves Java, duke loves Java!";
int index = sentence.indexOf("Java");
while (index > -1) {
IO.println("Found at index " + index);
index = sentence.indexOf("Java", index + 1);
}
IO.println("Done.");
Found at index 11
Found at index 28
Found at index 45
Done.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://dev.java/learn/