JavaRush /Kurslar /All lectures for UZ purposes /Java'da Stringlar bilan ishlash uchun yordamchi klasslar

Java'da Stringlar bilan ishlash uchun yordamchi klasslar

All lectures for UZ purposes
Daraja, Dars
Mavjud

1. StringTokenizer klassi

Va yana bir nechta eng ko'p uchraydigan stringlar bilan ishlash usullari. Stringni bir nechta qismlarga qanday bo'lish mumkin? Buning uchun bir nechta usullar mavjud.

split() metodi

Birinchi usul - stringni bir nechta qismlarga bo'lish uchun split() metodidan foydalanishdir. Bunga parametr sifatida muntazam ifodani berish kerak: alohidalovchi stringning maxsus shabloni. Muntazam ifoda nima ekanligini Java Multithreading kvestida o'rganasiz.

Misol:

Kod Natija
String str = "Good news everyone!";
String[] strings = str.split("ne");
System.out.println(Arrays.toString(strings));
Natija uchta stringdan iborat massiv bo'ladi:
["Good ", "ws everyo", "!"]

Oddiy, lekin ba'zida bunday yondashuv ortiqcha. Agar ko'plab alohidalovchilar mavjud bo'lsa, masalan, "bo'shliq", "enter", "tab", "nuqta", ulkan muntazam ifodani yaratishga to'g'ri keladi. Uni o'qish qiyin, demak, unga o'zgartirish kiritish ham qiyin.

StringTokenizer klassi

Java'da maxsus klass mavjud, bu klassning butun ishi stringni kichik stringlarga ajratishdan iborat.

Bu klass muntazam ifodalardan foydalanmaydi: buning o'rniga, unga faqat alohidalovchi belgilar qatori beriladi. Bu yondashuvning afzalliklaridan biri shundaki, u butun stringni darhol parchalarga ajratmaydi, balki oxirigacha asta-sekin boradi.

Klass konstruktor va ikkita asosiy metoddan iborat. Konstruktoriga ajratayotgan string va ajratishda ishlatiladigan belgilar to'plami sifatida qator kiritish kerak.

Metodlar Tavsif
String nextToken()
Keyingi kichik stringni qaytaradi
boolean hasMoreTokens()
Kichik stringlar bor-yo'qligini tekshiradi.

Bu klass Scanner klassiga biroz o'xshab ketadi, unda ham nextLine() va hasNextLine() metodlari mavjud edi.

StringTokenizer obyektini yaratish uchun quyidagi buyruqdan foydalaning:

StringTokenizer name = new StringTokenizer(string, delimiters);

Bu erda string - bu string, biz qisimlarga ajratamiz. Va delimiters - bu har bir belgi alohidalovchi sifatida hisoblanadigan qator bo'ladi. Misol:

Kod Ekranda chiqarish
String str = "Good news everyone!";

StringTokenizer tokenizer = new StringTokenizer(str,"ne");
while (tokenizer.hasMoreTokens())
{
   String token = tokenizer.nextToken();
   System.out.println(token);
}
Good 
ws 
v
ryo
!

E'tibor bergan bo'lsangiz, alohidalovchi sifatida konstruktor StringTokenizerdga kiritilgan ikkinchi stringdagi har bir belgi hisoblanadi.



2. String.format() metodi va StringFormatter klassi

Va String klassining yana bir qiziqarli metodi - format().

Deylik, sizda turli o'zgaruvchilar bor. Ularni bitta qator sifatida ekranga qanday chiqarish mumkin? Masalan, bizda ma'lumotlar (chap ustun) va kerakli natija (o'ng ustun) bor:

Kod Ekranda chiqarish
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;
User = {name: Amigo, age: 12 years, friend: Diego, weight: 200 kg.}

Ko'pincha, kodingiz taxminan shunday ko'rinishda bo'ladi:

Dastur kodi
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;

System.out.println("User = {name: " + name + ", age:" + age + " years, friend: " + friend+", weight: " + weight + " kg.}");

Bunday kod oson o'qilmaydi. Bundan tashqari, agar o'zgaruvchilar nomlari uzunroq bo'lsa, kod yanada qiyinlashadi:

Dastur kodi

class User {
    ......
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public List<String> getFriends() {
        return friends;
    }

    public ExtraInformation getExtraInformation() {
        return extraInformation;
    }
}

User user = new User();

System.out.println("User = {name: " + user.getName() + ", age:" + user.getAge() + " years, friend: " + user.getFriends().get(0) + ", weight: " + user.getExtraInformation().getWeight() + " kg.}");

Bu oson o'qilmaydi, shunday emasmi?

Lekin haqiqiy dasturlarda bunday holat ko'pincha uchraydi, shuning uchun men bu kodni qanday qilib osonroq va qisqaroq yozish mumkinligini aytib bermoqchiman.

String.format

String klassida format() deb nomlangan statik metod mavjud: u stringlarni ma'lumotlar bilan birlashtirish uchun shablonni belgilash imkonini beradi. Bu buyruqning umumiy ko'rinishi quyidagicha:

String name = String.format(shablon, parametrlar);

Misol:

Kod Natija
String.format("Age=%d, Name=%s", age, name);
Age=12, Name=Amigo
String.format("Width=%d, Height=%d", width, height);
Width=20, Height=10
String.format("Fullname=%s", name);
Fullname=Diego

format() metodiga birinchi parametr sifatida shablon qatori yuboriladi, unda butun kerakli matn bor va ma'lumotlarni qo'shish kerak bo'lgan joylarda %d, %s kabi maxsus belgilar ko'rsatilgan.

Ushbu %s va %d format() metodi to'g'ridan-to'g'ri shablondan keyin kelgan parametrlar bilan almashtiriladi. Agar sifatida string qo'shilishi kerak bo'lsa, biz %s deb yozamiz, agar son bo'lsa - %d. Misol:

Kod Natija
String s = String.format("a=%d, b=%d, c=%d", 1, 4, 3);
s ning qiymati "a=1, b=4, c=3" bo'ladi

Bu yerda shablon ichida foydalanish mumkin bo'lgan parametrlar ro'yxati:

Belgisi Ma'nosi
%s
String
%d
butun son: byte, short, int, long
%f
real son: float, double
%b
boolean
%c
char
%t
Date
%%
% belgisi

Bu parametrlar ma'lumotlar turini belgilaydi, lekin mavjud boshqa parametrlar ham bor, ular ma'lumotlarning joylashuvini belgilaydi. Parametrni uning raqamiga ko'ra olish uchun (raqamlash birdan boshlanadi), %1$d o'rniga %d yozish kerak. Misol:

Kod Natija
String s = String.format("a=%3$d, b=%2$d, c=%d", 11, 12, 13);
s ning qiymati "a=13, b=12, c=11" bo'ladi

%3$d 3-parametrni oladi, %2$d esa ikkinchi parametrni oladi. %d birinchi parametrni oladi. Shablon parametrlar %s, %d o'zgaruvchilarga %3$d yoki %2$s kabi shablon parametrlaridan mustaqil murojaat qiladi.



3. String Pool

Kodda literallar ko'rinishida berilgan barcha qatorlar, dastur ishlayotgan vaqtida StringPool deb nomlangan xotirada saqlanadi. StringPool — qatorlarni saqlash uchun maxsus jadvaldir (aslida, xesh-jadval). Uning yaratilishidagi maqsad — qatorlarni saqlashni optimallashtirish:

Birinchidan, kodda berilgan qatorlar baribir biror joyda saqlanishi kerak. Kod — bu buyruqlar, va ma'lumotlar (ayniqsa, xuddi qatorlar kabi katta bo'lganlari) koddan alohida xotirada saqlanishi kerak. Kodda faqat qator-ob'yektlariga ishoratlar uchraydi.

Ikkinchidan, bir xil literallar xotirada faqat bir marta saqlanishi mumkin. Bu shunday ishlaydi: har bir qator literali uchun Java-mashinasi StringPooldagi qatordan foydalanadi. Agar bunday qator u yerda hali yo'q bo'lsa, u qo'shiladi, agar allaqachon bo'lsa, unga ishora ishlatiladi. (Bu aynan qachon sodir bo'lishi — sinf yuklanganda yoki literal birinchi marta ishlatilganda — JVM amalga oshirilishiga bog'liq.)

Shuning uchun, agar kodingizda bir nechta String o'zgaruvchilarga bir xil literallarni tayinlasangiz, o'zgaruvchilar bir xil manzillarni saqlaydi. StringPoolga literal faqat bir marta qo'shiladi, qolgan hollarda StringPoolga allaqachon yuklangan qator uchun ishorat olinadi.

Bu qanday ishlashini taxminan:

Kod StringPool bilan ish
String a = "Salom";
String b = "Salom";
String c = "Xayr";
String[] pool = {"Salom", "Xayr"};
a = pool[0];
b = pool[0];
c = pool[1];

Shuning uchun a va b o'zgaruvchilar bir xil ishoralarni saqlaydi.

intern() metodi

Va eng qiziqarli tomoni: siz dasturiy ravishda StringPoolga istalgan qatorni qo'shishingiz mumkin. Buning uchun String o'zgaruvchi bilan intern() metodini chaqirish kifoya.

intern() metodi qatorni StringPoolga qo'shadi, agar u hali u yerda bo'lmasa, va StringPooldan qator uchun ishoratni qaytaradi.

Agar StringPoolga intern() metodi orqali ikkita bir xil qator qo'shsangiz, metod bir xil ishoralarni qaytaradi. Bu qatorlarni ishorat orqali taqqoslash uchun ishlatilishi mumkin. Misol:

Kod Eslatma
String a = new String("Salom");
String b = new String("Salom");
System.out.println(a == b);


false
String a = new String("Salom");
String b = new String("Salom");

String t1 = a.intern();
String t2 = b.intern();
System.out.println(a == b);
System.out.println(t1 == t2);





false
true

Bu metoddan tez-tez foydalanishingiz dargumon, lekin bu savol intervyu paytida ko'p beriladi, shuning uchun bu haqda bilgan yaxshi.


Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION