- مواد و روش ها
- ایجاد یک رشته تصادفی
- مقایسه رشته:
equals()
یا ==
؟
این کلاس
String
اغلب توسط برنامه نویسان استفاده می شود، بنابراین باید آن را به خوبی یاد گرفت.
به یاد داشته باشید که اشیاء کلاس
String
تغییر ناپذیر هستند. بنابراین وقتی فکر می کنید که یک رشته را تغییر می دهید، در واقع یک رشته جدید ایجاد می کنید. جاوا کلاس های ویژه ای دارد
StringBuffer
و
StringBuilder
اجازه تغییر در یک رشته را می دهد. کلاس ها
String
،
StringBuffer
,
StringBuilder
در بسته
java.lang تعریف شده اند و به طور خودکار بدون اظهارنامه واردات در دسترس هستند. هر سه کلاس اینترفیس را پیاده سازی می کنند
CharSequence
. ایجاد رشته بسیار ساده است. برای مثال می توانید این کار را انجام دهید:
String aboutCat = "Кот - это звучит гордо, а если наступить на хвост, то громко";
می توانید یک آرایه از رشته ها ایجاد کنید:
String[] cats = {"Васька", "Barsik", "Murzik"};
می توانید یک شی کلاس خالی ایجاد کنید
String
:
String str = new String();
شما می توانید یک رشته از طریق یک آرایه کاراکتر ایجاد کنید:
char[] chars = { 'c', 'a', 't' };
String str = new String(chars);
همچنین سازنده ای وجود دارد که به شما امکان می دهد محدوده یک آرایه کاراکتر را تنظیم کنید. شما باید شروع محدوده و تعداد کاراکترهای مورد استفاده را مشخص کنید:
char[] chars = {'c', 'a', 't', 'a', 'm', 'a', 'r', 'a', 'n' };
String str = new String(chars, 0, 3);
شما می توانید یک شی کلاس
String
از یک شی کلاس
StringBuffer
با استفاده از
StringBuilder
سازنده های زیر ایجاد کنید:
String(StringBuffer an object_StrBuf)
String(StringBuilder an object_StrBuild)
اپراتورها +
و += برایString
در جاوا علامت مثبت (
+
) به معنای الحاق رشته ها و به عبارت دیگر ترکیب رشته ها است.
String cat = "Кот";
String name = "Васька";
String fullname = cat + " " + name;
اگر یکی از عملوندهای یک عبارت شامل یک رشته باشد، دیگر عملوندها نیز باید رشته باشند. بنابراین، خود جاوا می تواند متغیرها را به یک نمایش رشته ارسال کند، حتی اگر آنها رشته ای نباشند.
int digit = 4;
String paws = " лапы";
String aboutcat = digit + paws;
За кулисами Java за нас преобразовало число 4 в строку "4"
قالب بندی رشته ها
بیایید فرض کنیم یک منبع رشته ای داریم:
<string name="aboutcat">У кота по имени Барсик четыре лапы, один хвост. Ему 5 лет</string>
برای نمایش این رشته به صورت برنامه نویسی در عنصر
TextView
می توانید از کد زیر استفاده کنید:
TextView tvCatsInfo = (TextView)findViewById(R.id.textView1);
tvCatsInfo.setText(R.string.aboutcat);
تصور کنید که چندین گربه دارید. البته می توانید خط مخصوص به خود را برای هر گربه داشته باشید. اما خطوط بسیار شبیه به هم هستند، فقط نام ها و سن ها تغییر می کند. شما همچنین می توانید تعداد پنجه ها و دم ها را تغییر دهید (چه سیگاری می کشید؟). در چنین مواردی می توانید قالب بندی رشته را اعمال کنید. ما باید کلماتی را که تغییر خواهیم داد تعیین کنیم و آنها را با مجموعه خاصی از کاراکترها جایگزین کنیم که با نماد درصد شروع می شود، سپس عددی که یک عدد افزایش می یابد، سپس
$s
برای رشته ها یا
$d
اعداد. بنابراین بیایید منبع رشته خود را به این صورت تغییر دهیم:
<string name="aboutcat">У кота по имени %1$s %2$s лапы, %3$s хвост. Ему %4$d лет</string>
بیایید تغییراتی در کد ایجاد کنیم:
String strBarsik = "Barsik";
String strPaws = "четыре";
String strTail = "one";
int year = 5;
String strCats = getResources().getString(R.string.aboutcat);
String strFinal = String.format(strCats, strBarsik, strPaws, strTail, year);
tvCatsInfo.setText(strFinal);
اگر گربه Vaska دارید و او شش ساله است، دو متغیر اضافه کنید و خط را قالب بندی کنید
String strVaska = "Васька";
year = 6;
String strFinal = String.format(strCats, strVaska, strPaws, strTail, year);
tvCatsInfo.setText(strFinal);
در اینجا یک مثال قالب بندی ساده است. آن را به خاطر بسپارید و در مکان های مناسب از آن استفاده کنید.
منبع رشته
توصیه می شود رشته ها را در منابع ذخیره کنید. دسترسی برنامه نویسی به یک منبع رشته به صورت زیر انجام می شود:
String catName = getResources().getString(R.string.barsik);
استخراج رشته ها از آرایه های رشته ای در منابع
فرض کنید یک آرایه رشته ای دارید که در یک فایل
strings.xml به نام تعریف شده است
cats_array
. سپس می توانید به ردیف هایی از منابعی مانند زیر دسترسی داشته باشید:
Resources res = getResources();
String[] cats = res.getStringArray(R.array.cats_array);
مواد و روش ها
public char charAt (int index)
کاراکتر را در افست مشخص شده در این رشته برمی گرداند. شمارش معکوس از 0 شروع می شود. نیازی به استفاده از مقادیر منفی و ناموجود نیست، جدی تر باشید. برای استخراج چندین کاراکتر از
getChars()
.
String testString = "Котёнок";
char myChar = testString.charAt(2);
tv.setText(Character.toString(myChar));
public int codePointAt(int index)
کاراکتر یونیکد را در شاخص داده شده برمی گرداند
String testString = "Котёнок";
int myChar = testString.codePointAt(3);
tv.setText(String.valueOf(myChar));
public int codePointBefore(int index)
کاراکتر Unicode را که قبل از ایندکس داده شده است، برمیگرداند
String testString = "Котёнок";
int myChar = testString.codePointBefore(4);
tv.setText(String.valueOf(myChar));
public int codePointCount(int start, int end)
تعداد کاراکترهای یونیکد را بین موقعیت ها
start
و
end
String testString = "Котёнок";
int myChar = testString.codePointCount(0, 3);
tv.setText(String.valueOf(myChar));
public int compareTo(String string)
رشته مشخص شده را با استفاده از مقادیر کاراکتر یونیکد مقایسه می کند و محاسبه می کند که کدام رشته کمتر، مساوی یا بزرگتر از رشته بعدی است. قابل استفاده برای مرتب سازی مورد در نظر گرفته شده است. اگر رشته ها مطابقت داشته باشند، 0 برگردانده می شود، اگر کمتر از صفر باشد، رشته فراخوان کمتر از رشته است
string
، اگر بزرگتر از صفر باشد، رشته فراخوان بزرگتر از رشته است
string
. کلمات بزرگ بالای حروف کوچک قرار می گیرند.
String testString = "Котёнок";
if (testString.compareTo("котёнок") == 0) {
tvInfo.setText("Строки равны");
} else {
tvInfo.setText("Строки не равны. Возвращено"
+ testString.compareTo("котёнок"));
}
بیایید آرایه رشته ها را با استفاده از مرتب سازی حبابی مرتب کنیم.
String[] poem = { "Мы", "везём", "с", "собой", "кота" };
for (int j = 0; j < poem.length; j++) {
for (int i = j + 1; i < poem.length; i++) {
if (poem[i].compareTo(poem[j]) < 0) {
String temp = poem[j];
poem[j] = poem[i];
poem[i] = temp;
}
}
System.out.println(poem[j]);
}
در نتیجه دریافت می کنیم:
Мы
везём
кота
с
собой
همانطور که می بینید،
تغییر مکان اصطلاحات، مجموع مرتب سازی گربه ها را تغییر نمی دهد.
public int compareToIgnoreCase (String string)
رشته مشخص شده را با استفاده از مقادیر کاراکتر یونیکد، غیر حساس به حروف بزرگ مقایسه می کند.
String testString = "Котёнок";
if (testString.compareToIgnoreCase("котёнок") == 0) {
tv.setText("Строки равны");
} else {
tv.setText("Строки не равны. Возвращено"
+ testString.compareTo("котёнок"));
}
public String concat (String string)
یک رشته را با رشته مشخص شده الحاق می کند. یک رشته جدید برگردانده می شود که حاوی الحاق دو رشته است. توجه داشته باشید که نام روش خود حاوی یک گربه است!
String testString = "Сук";
String newString = testString.concat("кот");
tv.setText(newString);
متد همان عملکرد عملگر را انجام می دهد
+
و می تواند نوشته شود
Сук + кот
. اما یک گربه واقعی از روش "گربه" استفاده می کند.
public boolean contains (CharSequence cs)
تعیین می کند که آیا یک رشته دارای دنباله ای از کاراکترها است یا خیر
CharSequence
String testString = "котёнок";
if(testString.contains("кот")){
infoTextView.setText("В слове котёнок содержится слово кот!");
}
public static String copyValueOf (char[] data, int start, int length)
یک رشته جدید حاوی کاراکترهای مشخص شده از آرایه ایجاد می کند
Data
که از موقعیت
start
(شماره گذاری مبتنی بر صفر) طول طول
شروع می شود .
public static String copyValueOf(char[] data)
یک رشته جدید حاوی کاراکترهای آرایه مشخص شده ایجاد می کند. تغییر آرایه پس از ایجاد ردیف، ردیف ایجاد شده را تغییر نمی دهد.
public boolean endsWith(String suffix)
بررسی می کند که آیا یک رشته به پایان می رسد یا خیر
suffix
.
String str1 = "Суккот";
if(str1.endsWith("кот"))
infoTextView.setText("Слово заканчивается на котике");
else
infoTextView.setText("Плохое слово. Нет смысла его использовать");
public boolean equals (Object string)
شی مشخص شده و یک رشته را مقایسه می کند و اگر رشته های مقایسه شده برابر باشند،
true را برمی گرداند. شامل کاراکترهای یکسان و به ترتیب حساس به حروف کوچک و بزرگ است.
String str1 = "Кот";
String str2 = "Кошка";
if(str1.equals(str2))
infoTextView.setText("Строки совпадают");
else
infoTextView.setText("Строки не совпадают");
این روش نباید با عملگر اشتباه شود
==
، که دو مرجع شی را مقایسه می کند و تعیین می کند که آیا آنها به یک نمونه ارجاع می دهند یا خیر. مقایسه رشته ها را ببینید:
equals()
یا
==
?
public boolean equalsIgnoreCase(String string)
رشته مشخص شده را با رشته منبع به روشی بدون حروف بزرگ مقایسه می کند و در صورت مساوی بودن
مقدار true را برمی گرداند. محدوده AZ برابر با محدوده az در نظر گرفته می شود.
String str1 = "Кот";
String str2 = "кот";
if(str1.equalsIgnoreCase(str2))
infoTextView.setText("Строки совпадают");
else
infoTextView.setText("Строки не совпадают");
public static String format(Locale locale, String format, Object... args)
یک رشته قالب بندی شده را با استفاده از قالب ارائه شده و آرگومان های بومی سازی شده در محدوده داده شده برمی گرداند. به عنوان مثال تاریخ یا زمان
String.format("%.2f", floatValue);
دو کلمه را که روی یک خط جدید ظاهر می شوند، چسب می زنیم. در این حالت کلمه دوم با حروف بزرگ نمایش داده می شود.
String str1 = "Кот";
String str2 = "васька";
String strResult = String.format("%s\n%S", str1, str2);
infoTextView.setText(strResult);
عدد را به سیستم هشتگانه تبدیل کنید.
String str1 = "8";
int inInt = Integer.parseInt(str1);
String strResult = String.format("(Восьмеричное meaning): %o\n", inInt);
infoTextView.setText(strResult);
بر اساس قیاس، ما در سیستم هگزادسیمال نمایش می دهیم
String str1 = "255";
int inInt = Integer.parseInt(str1);
String strResult = String.format("(Шестнадцатеричное meaning): %x\n", inInt);
infoTextView.setText(strResult);
برای استفاده از حروف بزرگ
%X
, پس از
ff
آن خواهد شد
FF
. برای استفاده از سیستم اعشاری
%d
. تاریخ نیز می تواند به روش های مختلف نمایش داده شود.
Date now = new Date();
Locale locale = Locale.getDefault();
infoTextView.setText(
String.format(locale, "%tD\n", now) +
String.format(locale, "%tF\n", now) +
String.format(locale, "%tr\n", now) +
String.format(locale, "%tz\n", now) +
String.format(locale, "%tZ\n", now));
public byte[] getBytes(String charsetName)
یک رشته فرمت شده را با استفاده از قالب ارائه شده برمی گرداند.
public void getBytes(int start, int end, byte[] data, int index)
و سایر اضافه بارها این روش کاراکترها را در یک آرایه بایت ذخیره می کند، که جایگزینی برای
getChars()
. اغلب هنگام صادرات رشته ها از منابع مختلف که از دیگر کاراکترهای یونیکد استفاده می کنند استفاده می شود. به عنوان مثال، جاوا به طور پیش فرض با کاراکترهای یونیکد 16 بیتی کار می کند و در اینترنت، رشته ها اغلب از یونیکد 8 بیتی، اسکی و غیره استفاده می کنند.
public void getChars(int start, int end, char[] buffer, int index)
روشی برای استخراج چندین کاراکتر از یک رشته. باید شاخص ابتدای رشته فرعی (
start
)، شاخص کاراکتر بعد از پایان رشته فرعی که باید استخراج شود (پایان) را مشخص کنید. آرایه ای که کاراکترهای انتخاب شده را دریافت می کند در پارامتر
بافر قرار دارد . ایندکس در آرایه که رشته فرعی از آن نوشته میشود، در پارامتر
index ارسال میشود . مطمئن شوید که آرایه به اندازه کافی بزرگ است که شامل تمام کاراکترهای زیر رشته مشخص شده باشد.
String unusualCat = "Котёнок по имени Гав";
int start = 5;
int end = 12;
char[] buf = new char[end - start];
unusualCat.getChars(start, end, buf, 0);
infoTextView.setText(new String(buf));
public int hashCode()
یک عدد صحیح که کد هش این شی است را برمیگرداند.
public int indexOf(int c)
شماره اولین موقعیتی که با شاخص مشخص شده c مواجه شده را برمی گرداند.
String testString = "котёнок";
infoTextView.setText(String.valueOf(testString.indexOf("ё")));
public int indexOf (int c, int start)
شاخص را از موقعیت، شروع می کند
start
String testString = "котёнок";
infoTextView.setText(String.valueOf(testString.indexOf("ё", 4)));
public int indexOf (String string)
به دنبال رشته ای از کاراکترها می گردد
subString
String testString = "У окошка";
infoTextView.setText(String.valueOf(testString.indexOf("кошка")));
public int indexOf (String subString, int start)
به دنبال رشته ای از کاراکترهایی است
subString
که از موقعیت شروع می شوند
start
String testString = "У окошка";
infoTextView.setText(String.valueOf(testString.indexOf("кошка", 2)));
public String intern ()
"Hash" یک رشته
public boolean isEmpty ()
بررسی می کند که آیا رشته خالی است
if(catname.isEmpty()) {
}
این روش در API 9 (اندروید 2.1) ظاهر شد. برای دستگاههای قدیمیتر،
String.length() == 0
public int lastIndexOf (String string) и другие перегруженные версии
از تعداد آخرین موقعیتی که در نمایه مشخص شده مشاهده شده را برمیگرداند. به عنوان مثال، می توانید نام فایل را بدون پسوند به صورت زیر دریافت کنید:
filename.toString().substring(0, filename.getString().lastIndexOf("."));
در این مثال موقعیت آخرین نقطه را بدست می آوریم و زیر رشته قبل از آن را می گیریم.
public int length()
طول یک رشته را برمیگرداند
String testString = "котёнок";
infoTextView.setText(String.valueOf(testString.length()));
public boolean matches(String regularExpression)
بررسی می کند که آیا یک رشته با عبارات منظم مطابقت دارد یا خیر.
public int offsetByCodePoints (int index, int codePointOffset)
موقعیتی را که در فاصله ای
codePointOffset
پس از موقعیت شروع مشخص شده توسط پارامتر قرار دارد، برمی گرداند.
index
public boolean regionMatches (int thisStart, String string, int start, int length)
این روش قسمت مشخص شده رشته را با قسمت دیگری از رشته مقایسه می کند. باید شاخص ابتدای محدوده ردیف شیء فراخوان کلاس را مشخص کنید
String
. رشته ای که باید مقایسه شود در پارامتر ارسال می شود
string
. شاخص کاراکتری که از آن مقایسه باید انجام شود در پارامتر ارسال می شود
start
و طول رشته فرعی که باید مقایسه شود در پارامتر ارسال می شود
length
.
public boolean regionMatches (boolean ignoreCase, int thisStart, String string, int start, int length)
نسخه بیش از حد بارگذاری شده این روش بخش مشخص شده یک رشته را با بخش دیگری از رشته مقایسه می کند، بدون توجه به حروف کوچک.
public String replace(CharSequence target, CharSequence replacement) и другие перегруженные версии
یک کاراکتر یا دنباله کاراکترها
target
را به
replacement
String testString = "whale";
infoTextView.setText(testString.replace("And", "о"));
public String replaceAll (String regularExpression, String replacement)
public String replaceFirst (String regularExpression, String replacement)
اولین کاراکترها را با استفاده از یک عبارت منظم حذف می کند. برای مثال، اگر باید صفرهای ابتدای اعداد 001، 007، 000024 را حذف کنید، می توانید از این تماس استفاده کنید.
String s = "001234-cat";
String s = s.replaceFirst ("^0*", "");
public String[] split (String regularExpression) и другие перегруженные версии
یک رشته را به آرایه ای از کلمات تقسیم می کند. به عنوان مثال، یک رشته Vaska Ryzhik Murzik Barsik وجود دارد و ما می خواهیم آرایه ای از نام گربه ها را دریافت کنیم:
String catnames = "Васька Рыжик Мурзик Барсик";
String aCats[] = catnames.split(" ");
ما گرفتیم:
aCats[0] = Васька
aCats[1] = Рыжик
aCats[2] = Мурзик
aCats[3] = Барсик
public boolean startsWith(String prefix)
بررسی می کند که آیا یک رشته با کاراکترهای
prefix
ابتدای رشته شروع می شود یا خیر
String str1 = "котлета";
if(str1.startsWith("кот"))
infoTextView.setText("Слово содержит кота");
else
infoTextView.setText("Плохое слово. Нет смысла его использовать");
public boolean startsWith(String prefix, int start)
بررسی می کند که آیا رشته داده شده با کاراکترهایی
prefix
در موقعیت مشخص شده شروع می شود یا خیر.
String str1 = "Суккот";
if(str1.startsWith("кот", 3))
infoTextView.setText("Слово содержит кота");
else
infoTextView.setText("Плохое слово. Нет смысла его использовать");
public CharSequence subSequence (int start, int end)
مشابه روش است
substring()
، اما می توان برای استفاده از
CharSequence
.
public String substring(int start)
و سایر اضافه بارها یک دنباله/رشته جدید با کاراکترهایی از رشته داده شده ایجاد می کند که از موقعیت شروع می شود
start
تا انتهای خط / با کاراکتر در موقعیت پایان می یابد
end
. خط جدید شامل کاراکترهایی از
start
انتها - 1 است، بنابراین یک کاراکتر دیگر می گیریم.
String testString = "скотина";
infoTextView.setText(testString.substring(1, 4));
public char[] toCharArray()
کاراکترهای این رشته را در یک آرایه کاراکتر کپی می کند. همین نتیجه را می توان از طریق
getChars()
. اسناد استفاده از این روش را توصیه نمیکنند، و پیشنهاد میکنند
charAt()
.
String unusualCat = "Котёнок по имени Гав";
char[] yomoe = unusualCat.toCharArray();
infoTextView.setText(String.valueOf(yomoe[3]));
public String toLowerCase() и другие перегруженные версии
یک رشته را به حروف کوچک تبدیل می کند. محلی پیش فرض تبدیل را کنترل می کند. گربه رشته = "گربه"; String low = cat.toLowerCase(); infoTextView.setText(پایین);
public String toString ()
رشته ای را برمی گرداند. برای خود رشته، که خودش قبلاً یک رشته است، بازگرداندن رشته بیهوده است (اوه، چقدر آن را خم کردم). اما این روش در واقع برای کلاس های دیگر بسیار مفید است.
public String toUpperCase()
یک رشته را به حروف بزرگ تبدیل می کند. محلی پیش فرض تبدیل را کنترل می کند.
String cat = "Кот";
String upper = cat.toUpperCase();
infoTextView.setText(upper);
public String trim()
فاصله های ابتدا و انتهای رشته را حذف می کند.
String str = " Hello Kitty ".trim();
infoTextView.setText(str);
public static String valueOf(long value)
و دیگر اضافه بارها محتویات (اعداد، اشیاء، کاراکترها، آرایه های کاراکتر) را به یک رشته تبدیل می کند.
int catAge = 7;
infoTextView.setText(String.valueOf(catAge));
ایجاد یک رشته تصادفی
فرض کنید به یک رشته تصادفی از کاراکترهای داده شده نیاز داریم.
private static final String mCHAR = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
private static final int STR_LENGTH = 9;
Random random = new Random();
public void onClick(View view) {
TextView infoTextView = (TextView) findViewById(R.id.textViewInfo);
infoTextView.setText(createRandomString());
}
public String createRandomString() {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < STR_LENGTH; i++) {
int number = random.nextInt(mCHAR.length());
char ch = mCHAR.charAt(number);
builder.append(ch);
}
return builder.toString();
}
مقایسه رشته: equals()
یا ==
؟
بیایید به یک مثال نگاه کنیم.
String str1 = "Murzik";
String str2 = new String(str1);
boolean isCat = str1 == str2;
infoTextView.setText(str1 + " == " + str2 + " -> " + isCat);
اگرچه دو متغیر حاوی کلمه یکسانی هستند، اما با دو شی متفاوت سروکار داریم و عملگر
false==
را برمی گرداند . یک بار، زمانی که درختان بزرگ بودند، لازم بود دو رشته را از منابع مختلف مقایسه کنم. اگرچه رشتهها دقیقاً یکسان به نظر میرسند، اما مقایسه با استفاده از اپراتور
غلط را نشان داد و همه کارتها را برای من اشتباه گرفت. و تنها پس از آن متوجه شدم که باید از . یک رشته در جاوا یک شی مجزا است که ممکن است با شی دیگری یکسان نباشد، اگرچه خروجی رشته ممکن است در صفحه یکسان به نظر برسد. فقط جاوا، در مورد عملگر منطقی (و همچنین )، ارجاعات را با اشیاء مقایسه می کند (هنگام کار با primitives چنین مشکلی وجود ندارد):
==
equals()
==
!=
String s1 = "hello";
String s2 = "hello";
String s3 = s1;
String s4 = "h" + "e" + "l" + "l" + "o";
String s5 = new String("hello");
String s6 = new String(new char[]{'h', 'e', 'l', 'l', 'o'});
infoTextView.setText(s1 + " == " + s2 + ": " + (s1 == s2));
GO TO FULL VERSION