JavaRush /Курсхо /All lectures for TG purposes /Классҳои ёрирасон барои кор бо сатрҳо дар Java

Классҳои ёрирасон барои кор бо сатрҳо дар Java

All lectures for TG purposes
Сатҳи , Дарс
дастрас

1. Класс StringTokenizer

Ва боз чанд сенарияи бештарини кор бо сатрҳо. Чӣ тавр сатре ба якчанд қисм тақсим мешавад? Барои ин якчанд роҳҳо ҳастанд.

Метод split()

Аввалин роҳ барои тақсим кардани сатре ба якчанд қисмҳо — истифодаи методи split() мебошад. Дар он ба сифати параметр бояд ифодаи муқаррарӣ дохил карда шавад: намунаи махсуси сатри-тақсимкунанда. Чӣ дар бораи ифодаҳои муқаррарӣ, шумо дар квест Java Multithreading мефаҳмед.

Мисол:

Код Натиҷа
String str = "Good news everyone!";
String[] strings = str.split("ne");
System.out.println(Arrays.toString(strings));
Маколаро дар натиҷа меофаред аз се сатри:
["Good ", "ws everyo", "!"]

Сода, аммо гоҳҳо чунин роҳ барзиёд аст. Агар тақсимкунандаҳо бисёранд, масалан, «фосила», «enter», «таб», «нуқта», лозим мешавад ифодаи мураккаби муқарарӣ сохтан, ки онро хондан мушкил мекунад ва табдили он низ мушкил меояд.

Класс StringTokenizer

Дар Java як класи махсус мавҷуд аст, ки тамоми кори вай - тақсим кардани сатри ба ҳастҳо мебошад.

Ин класс ифодаи муқаррарӣ истифода намекунад: ба ҷои ин ба он танҳо сатре дохил карда мешавад, ки аз рамзҳои ҷудокунанда иборат аст. Афзалияти ин роҳ дар он аст, ки он фавран тамоми сатри ба пораҳо тақсим намекунад, балки тадриҷан аз оғоз ба охир меравад.

Сохтори класс аз конструктор ва ду методи асосӣ иборат аст. Дар конструктор бояд сатре, ки мо онро ба қисмҳо тақсим мекунем ва сатри — маҷмӯи рамзҳои истифодашаванда барои тақсим кардан, дохил карда шавад.

Методҳо Тавсиф
String nextToken()
Ҳастаи навбатиро бармегардонад
boolean hasMoreTokens()
Тафтиш мекунад, ки боз ҳастҳам ҳаст.

Ин класс ба класс Scanner каме монанд аст, ки ҳамон метод nextLine() ва hasNextLine() дошт.

Для сохтани объект StringTokenizer лозим аст, ки фармоиш дода шавад:

StringTokenizer име = new StringTokenizer(строка, разделители);

Дар он сатри — ин строка аст, ки мо онро ба қисмҳо тақсим мекунем. Ва разделители — ин сатри, ки ҳар як рамзи он ҳамчун рамзи ҷудокунанда ҳисобида мешавад. Мисол:

Код Намоиши экран
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
!

Ба назар гиред, ки ҳар як рамзи сатре, ки дар таркиби дуввуми конструктори StringTokenizer гузошта шудааст, ҳамчун рамзи тақсимкунанда ҳисобида мешавад.



2. Метод String.format() ва класс StringFormatter

Ва боз дигар методи ҷолиби класи String — format().

Бигзор, ки шумо маълумотҳои гуногун доред. Чӣ гуна онҳоро дар як сатр ба экран баровардан мумкин аст? Масалан, мо маълумот дорем (сахифа чап) ва намоиши дилхоҳ (сахифа рост):

Код Намоиши экран
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;
User = {name: Amigo, age: 12 years, friend: Diego, weight: 200 kg.}

Шояд коди шумо тақрибан ҳамин тавр бошад:

Код программы
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.}");

Ин код чандон хонданбахш нест. Боз, агар номҳои параметрҳо дарозтар мебуданд, код боз мушкилтар мешуд:

Код программы

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.}");

На он қадар хонданбахш, нест?

Аммо дар барномаҳои воқеӣ чунин ҳолат зуд-зуд пайдо мешавад, бинобар ин ман мехоҳам дар бораи роҳи соддатар ва кӯтоҳтар кардани ин код нақл кунам.

String.format

У класи String методи статикӣ format() дорад: он имкон медиҳад намунаи пайвасти сатри бо маълумотҳоро муқаррар кунад. Намуди умумии ин команда чунин аст:

String имя = String.format(шаблон, параметры);

Мисол:

Код Натиҷа
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() аввалин параметр сатри-намуна мегузоранд, ки тамоми матни лозимиро дарбар мегирад, аммо дар ҷойҳое, ки бояд маълумот дохил шавад, рамзҳои махсус навишта мешаванд, ба монанди %d, %s ва ғайра.

Ин %s ва %d методи format() иваз мекунанд ба параметрҳое, ки дар пайи сатри-намуна омадаанд. Агар лозим бошад сатри дохил карда шавад, мо %s менависем, агар рақам бошад — %d. Мисол:

Код Натиҷа
String s = String.format("a=%d, b=%d, c=%d", 1, 4, 3);
s баробар хоҳад буд ба "a=1, b=4, c=3"

Ин номгӯи кӯтоҳи параметрҳоест, ки метавон дар дохили намуна истифода кард:

Символ Значение
%s
String
%d
рақами бутун: byte, short, int, long
%f
рақами ҳақиқӣ: float, double
%b
boolean
%c
char
%t
Date
%%
Символ %

Ин параметрҳо ба намуди маълумот ишора мекунанд, аммо инчунин параметрҳо ҳастанд, ки ба тартиби маълумот ишора мекунанд. То ки параметрро аз рӯи рақами он (рақамзанӣ аз як оғоз мешавад) гирифт, бояд %1$d ба ҷои %d нависед. Мисол:

Код Натиҷа
String s = String.format("a=%3$d, b=%2$d, c=%d", 11, 12, 13);
s баробар хоҳад буд ба "a=13, b=12, c=11"

%3$d параметри 3-умро медиҳад, %2$d параметри дуюмро. %d параметри аввалро медиҳад. Параметрҳои намунаи %s, %d ба параметрҳои-намунӣ назар мекунанд, новобаста аз параметрҳои намунаи навъи %3$d ё %2$s



3. String Pool

Ҳамаи сатрҳое, ки дар код дар шакли литералҳо таъин шудаанд, ҳангоми коркарди барнома дар хотира дар тако номида шуд асосан StringPool нигоҳ дошта мешаванд. StringPool — ин маҷмӯи махсус барои захираи сатрҳо мебошад. Ҳадаф аз он оптимизатсияи захираи сатрҳо мебошад:

Аввалан, сатрҳое, ки дар код таъин шудаанд, бояд дар куҷое захира карда шаванд. Код - ин фармоишҳо, аммо маълумот (аз ин ҷумла бузургҳое мисли сатрҳо) бояд дар хотира алоҳида аз код захира карда шаванд. Дар код танҳо истинодҳо ба объекти-сатрҳо вуҷуд доранд.

Сониян, ҳама литералҳои якхела метавонанд танҳо як бор дар хотира захира шаванд. Ин ҳамон тавр кор мекунад. Вақте ки коди шморо Java-мошинбор мекунад тамоми литералҳои стрингӣ ба StringPool илова карда мешаванд, агар онҳо он ҷо ҳанӯз набошанд. Агар алакай бошанд, истиноди ба сатр аз StringPool истифода мешавад.

Бинобар ин, агар шумо дар коди худ ба чанд String-параметр literallҳои якхела таъин кунед, параметрҳо хоҳанд дошт истиноди якхела. Дар StringPool literall танҳо як бор илова карда мешавад, дар тамоми ҳолатҳои дигар истиноди ба сатр, ки ҳангоми ба StringPool илова шудааст, истифода бурда мешавад.

Чӣ тавр ин тақрибан кор мекунад:

Код Кор бо StringPool
String a = "Привет";
String b = "Привет";
String c = "Пока";
String[] pool = {"Привет", "Пока"};
a = pool[0];
b = pool[0];
c = pool[1];

Бинобар ин, параметрҳои a ва b истинодҳои якхела нигоҳ медоранд.

Метод intern()

Ну ва чизи ҷолибтаринаш: шумо метавонед ҳар кадом сатрро дар StringPool барномашаванда ворид кунед. Барои ин танҳо лозим аст, ки метод intern() дар String-параметр хонед.

Метод intern() сатрро дар StringPool илова мекунад, агар он дар он ҷо ҳанӯз нест ва истиноди ба сатр аз StringPool бармегардонад.

Агар дар StringPool хоҳиш бо методи intern() ду сатрҳои якхела илова шаванд, методи якхели истинодҳоро бармегардонад. Ин метавонад барои муқоисаи ин сатҳо аз рӯи истинод истифода шавад. Мисол:

Код Эзоҳ
String a = new String("Привет");
String b = new String("Привет");
System.out.println(a == b);


false
String a = new String("Привет");
String b = new String("Привет");

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





false
true

Шояд ин методро зиёд истифода набашта бошед, аммо дар мусоҳибаҳо дар бораи он пурсиданро дӯст медоранд, бинобар ин беҳтар аст дар бораи он донед, ки надонед.


Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION