CodeGym /Kurslar /Java SELF AZ /Java'da sətirlərlə işləmək üçün köməkçi siniflər

Java'da sətirlərlə işləmək üçün köməkçi siniflər

Java SELF AZ
Səviyyə , Dərs
Mövcuddur

1. StringTokenizer Sinifi

Və sətirlərlə işləməyin ən çox istifadə olunan bir neçə ssenarisi. Sətiri bir neçə hissəyə necə bölmək olar? Bunun üçün bir neçə üsul var.

split() Metodu

Sətiri bir neçə hissəyə bölməyin ilk üsulu — split() metodundan istifadə etməkdir. Bu metoda parametr olaraq müntəzəm ifadə: xüsusi ayırıcı sətir şablonu ötürmək lazımdır. Müntəzəm ifadə nədir, bunu Java Multithreading macərasında öyrənəcəksiniz.

Nümunə:

Kod Nəticə
String str = "Good news everyone!";
String[] strings = str.split("ne");
System.out.println(Arrays.toString(strings));
Nəticə üç sətirdən ibarət bir massiv olacaq:
["Good ", "ws everyo", "!"]

Sadədir, amma bəzən bu yanaşma artıq dərəcədə böyük olur. Əgər çoxlu ayırıcılar varsa, məsələn, "mobil", "enter", "tab", "nöqtə", kifayət qədər mürəkkəb müntəzəm ifadə yaratmaq lazım gəlir. Bu ifadəni oxumaq və dəyişiklik etmək çətinləşir.

StringTokenizer Sinifi

Java-da xüsusi bir sinif var ki, onun işi yalnız bir sətiri alt-sətirlərə bölməkdən ibarətdir.

Bu sinif müntəzəm ifadələrdən istifadə etmir: bunun yerinə simvolların toplusundan ibarət bir sətir ötürülür. Bu yanaşmanın üstünlüyü ondadır ki, bütün sətiri dərhal parçalara bölmür, tədricən əvvəldən sona doğru hərəkət edir.

Sinif konstruktor və iki əsas metoddur. Konstruktora parçalayacağımız sətiri və ayırıcı kimi istifadə olunacaq simvolların toplandığı sətiri ötürmək lazımdır.

Metodlar Təsvir
String nextToken()
Növbəti alt-sətiri qaytarır
boolean hasMoreTokens()
Hələ daha alt-sətir olub olmadığını yoxlayır.

Bu sinif Scanner sinfini xatırladır, onda da nextLine()hasNextLine() metodları var idi.

StringTokenizer obyektini belə yaratmaq olar:

StringTokenizer ad = new StringTokenizer(sətir, ayırıcılar);

Burada sətir — sətir, parçalayacağımız sətir. ayırıcılar — hər simvolu ayırıcı simvol olaraq qəbul edilən sətir. Nümunə:

Kod Ekrana çıxarılması
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
!

Diqqət yetirin ki, StringTokenizer konstruktoruna ötürülən ikinci sətirdəki hər simvol ayırıcı kimi qəbul edilir.



2. String.format() metodu və StringFormatter sinfi

String sinfinin daha bir maraqlı metodu — format().

Tutaq ki, sənin müxtəlif məlumat dəyişənlərin var. Onları bir sətr kimi necə ekrana çıxarmaq olar? Məsələn, bizdə məlumatlar (sol sütun) və istənilən çıxış (sağ sütun) var:

Kod Ekran çıxışı
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;
User = {name: Amigo, age: 12 years, friend: Diego, weight: 200 kg.}

Çox güman ki, kod belə görünəcək:

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

Bu kod o qədər də oxunaqlı deyil. Üstəlik, dəyişənlərin adları daha uzun olsaydı, kod daha da mürəkkəbləşəcəkdi:

Proqram Kodu

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

Çox oxunaqlı deyil, elə deyilmi?

Amma real proqramlarda belə vəziyyətlər tez-tez baş verir, ona görə də bu kodu daha sadə və qısa yazmağın bir yolunu danışmaq istəyirəm.

String.format

String sinfində statik format() metodu var: bu metod, mətnlərin məlumatlarla birləşdirilməsi şablonunu təyin etməyə imkan verir. Bu komandanın ümumi görünüşü belədir:

String ad = String.format(şablon, parametrlər);

Nümunə:

Kod Nəticə
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() metodunda birinci parametr olaraq şablon sətri verilir, hansı ki, bütün lazım olan mətnləri ehtiva edir, lakin məlumatın lazım olduğu yerlərdə xüsusi simvollar yazılıb: %d, %s və s.

Metod format() parametrdən sonra gələn şablon simvollarını %s%d ilə əvəz edir. Sətir əlavə etmək üçün %s, rəqəmlər üçün isə %d yazırıq. Nümunə:

Kod Nəticə
String s = String.format("a=%d, b=%d, c=%d", 1, 4, 3);
s bərabər olacaq "a=1, b=4, c=3"

Bax bu parametrlər şablonda istifadə edilə bilər:

Simvol Açıqlama
%s
String
%d
Tam rəqəmlər: byte, short, int, long
%f
Kəsrli rəqəmlər: float, double
%b
boolean
%c
char
%t
Date
%%
Simvol %

Bu parametrlər məlumat tipini göstərir, lakin məlumatların sırasını göstərmək üçün başqa parametrlər də mövcuddur. Parametri nömrəsinə görə seçmək üçün (nömrələr birinci dən başlayır) %1$d əvəzinə %d yazmaq lazımdır. Nümunə:

Kod Nəticə
String s = String.format("a=%3$d, b=%2$d, c=%d", 11, 12, 13);
s bərabər olacaq "a=13, b=12, c=11"

%3$d üçüncü parametr-dəyişəni götürəcək, %2$d ikinci parametr-dəyişəni götürəcək. %d isə ən birinci parametr-dəyişəni götürəcək. Şablonun %s, %d kimi parametrləri şablon parametrlərindən, məsələn, %3$d və ya %2$s asılı deyil.



3. String Pool

Java-da literallar şəklində göstərilən bütün sətirlər proqram işləyərkən yaddaşda, adlanan bir məkanda saxlanılır - StringPool. StringPool — sətirləri saxlamaq üçün xüsusi bir massivdir. Onun yaradılmasının məqsədi sətirlərin saxlanılmasını optimallaşdırmaqdır:

Birincisi, kodda göstərilən sətirləri haradasa saxlamaq lazımdır. Kod — komandalardır, lakin məlumatlar (xüsusilə sətirlər kimi böyük obyektlər) koddan ayrı bir yaddaşda saxlanılmalıdır. Kodda yalnız obyekt-sətirlərə istinadlar olur.

İkincisi, bütün eyni literalları yalnız bir dəfə yaddaşda saxlamaq mümkündür. Bu belə də işləyir. Sinifinizin kodu Java maşın tərəfindən yüklənəndə, bütün sətir literalları, əgər artıq orada deyilsə, StringPool-a əlavə olunur. Orada artıq varsa, sadəcə StringPool-dan olan istinad istifadə olunur.

Bu səbəbdən, əgər kodunuzda bir neçə String-dəyişənə eyni literalları təyin etsəniz, dəyişənlər eyni istinadları saxlayacaq. StringPool-da literal yalnız bir dəfə əlavə olunur, digər hallarda isə artıq yüklənmiş StringPool sətirinə istinad götürülür.

Təxmini necə işləyir:

Kod StringPool ilə iş
String a = "Salam";
String b = "Salam";
String c = "Hələlik";
String[] pool = {"Salam", "Hələlik"};
a = pool[0];
b = pool[0];
c = pool[1];

Məhz bu səbəbdən ab dəyişənləri eyni istinadlara malik olacaq.

intern() metodu

Və ən maraqlısı: hər hansı bir sətiri proqramlaşdırılmış şəkildə StringPool-a əlavə edə bilərsiniz. Bunun üçün String dəyişəninin intern() metodunu çağırmaq kifayətdir.

intern() metodu, əgər sətir orada yoxdursa, onu StringPool-a əlavə edəcək və StringPool-dan olan sətirə istinad qaytaracaq.

Əgər intern() metodu ilə iki eyni sətiri StringPool-a əlavə etsəniz, metod eyni istinadları qaytaracaq. Bu sətirləri istinad vasitəsilə müqayisə etmək üçün istifadə oluna bilər. Misal:

Kod Qeyd
String a = new String("Salam");
String b = new String("Salam");
System.out.println(a == b);


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

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





false
true

Bu metodu tez-tez istifadə edəcəyiniz ehtimalı azdır, amma texniki müsahibələrdə bu haqda soruşmağı sevirlər, buna görə bilmək bilməməkdən yaxşıdır.


Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION