CodeGym /Kurslar /Java SELF AZ /Arrays Klassı, hissə 2

Arrays Klassı, hissə 2

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

1. Arrays.fill() Metodu

Java proqramçılar çox vaxt massivlərlə işləyərkən onları eyni dəyərlə doldurmaq ehtiyacı ilə qarşılaşır. Əlbəttə, dövr yazıb, sadəcə dövrdə massiv hüceyrələrinə müəyyən dəyəri təyin edə bilərsiniz:

int[] x = new int[100];
for (int i = 0; i < x.length; i++)
x[i] = 999;

Ya da sadəcə olaraq Arrays.fill() metodunu çağıraraq eyni işi görə bilərsiniz: göstərilən massivə göstərilən dəyəri təyin edir. Baxın, bu necə görünür:

Arrays.fill(ad, dəyər)

Beləliklə, yuxarıdakı nümunədəki kodu daha kompakt və başa düşülən edə bilərsiniz:

int[] x = new int[100];
Arrays.fill(x, 999);

Həmçinin Arrays.fill() metodu ilə yalnız bütün massiv deyil, onun bir hissəsini müəyyən dəyərlə doldura bilərsiniz:

Arrays.fill(ad, birinci, sonuncu, dəyər)

Burada birinci və sonuncu — doldurulması tələb olunan birinci və sonuncu hüceyrələrin nömrələridir.

Java-da illərdir qorunan qaydaya görə, sonuncu element diapazona daxil deyil.

Nümunə:

int[] x = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

Arrays.fill(x, 3, 7, 999);


String str = Arrays.toString(x);


Hüceyrələri doldururuq: x[3], x[4], x[5], x[6] dəyərlə 999. Hüceyrə nömrələmə sıfırdan başlayır!

str dəyişəninin dəyəri belə görsənir:
"[1, 2, 3, 999, 999, 999, 999, 8, 9, 10]"

Arrays.fill() metodu yalnız birölçülü massivlərlə işləyir. Əgər ona ikiölçülü massiv ötürülsə, o, birölçülü kimi işlənəcək və nəticələr uyğun olaraq dəyişəcək.



2. Arrays.copyOf() metodu

Artıq bildiyiniz kimi, massiv konteynerinin ölçüsünü yaradıldıqdan sonra dəyişmək mümkün deyil.

Bəs dəyişmək istəyirsinizsə?

Bəli, çox istəyirsinizsə, bu mümkündür:

  • İstənilən uzunluqda yeni massiv yaradın
  • Bütün elementləri ilk massivdən yeni massivə kopyalayın.

Məhz bunu Arrays.copyOf() metodu edir. Baxın, bu metod necə çağırılır:

tip[] ad2 = Arrays.copyOf(ad, uzunluq);

Bu metod mövcud massivi dəyişdirmir, əvəzində yeni bir massiv yaradır və ora köhnə massivin elementlərini kopyalayır.

Əgər elementlər yerləşməsə (uzunluq mövcud massivin uzunluğundan kiçikdirsə), artıq dəyərlər nəzərə alınmır.

Əgər yeni massivin uzunluğu köhnə massivdən böyükdürsə, hüceyrələr sıfırlarla doldurulur.

Nümunə:

int[] x = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

int[] x2 = Arrays.copyOf(x, 5);
String str2 = Arrays.toString(x2);

int[] x3 = Arrays.copyOf(x, 15);
String str3 = Arrays.toString(x3);


Dəyişən str2 bu dəyəri saxlayır:
"[1, 2, 3, 4, 5]"

Dəyişən str3 bu dəyəri saxlayır:
"[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0]"

3. Arrays.copyOfRange() metodu

Bəs siz 10 uzunluqlu massivdən 5 uzunluqlu massiv almaq istəyirsinizsə, amma ilk 5 elementi yox, son 5 elementi daxil etmək istəyirsinizsə, nə etməli?

Məhz bu vəziyyət üçün sizə Arrays sinifinin başqa bir metodu lazım olacaq - Arrays.copyOfRange() metodu. Onun çağırışı belə görünür:

tip[] ad2 = Arrays.copyOfRange(ad, birinci, sonuncu);

Bu metod da yeni massiv yaradır, amma onu ilkin massivdən istədiyiniz yerdən məlumatlarla doldurur. Burada birinci və sonuncu - yeni massivdə olması lazım olan ilk və son hüceyrələrin nömrələridir.

Java-da köhnə yaxşı ənənəyə görə, sonuncu element diapazona daxil olmur.

Nümunə:

int[] x = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20};

int[] x2 = Arrays.copyOfRange(x, 5, 10);
String str2 = Arrays.toString(x2);

int[] x3 = Arrays.copyOfRange(x, 5, 15);
String str3 = Arrays.toString(x3);


Dəyişən str2 aşağıdakı dəyəri saxlayır:
"[16, 17, 18, 19, 20]"

Dəyişən str3 aşağıdakı dəyəri saxlayır:
"[16, 17, 18, 19, 20, 0, 0, 0, 0, 0]"


4. Arrays.sort() metodu

Bu dəfə ən maraqlısı — sıralama. Proqramlaşdırmada massivləri sıralamaq lazımdır və bu çox tez-tez baş verir. Massivlərlə işləyərkən ən çox görülən üç əməliyyat:

  • Massivin sıralanması
  • Massivin minimal (və ya maksimal) elementinin tapılması
  • Elementin indeksinin tapılması (massivdə elementin axtarışı)

Və məhz buna görə Java tərtibatçıları Arrays sinfinə sort() metodunu daxil etmişlər. Onun çağırışı belə görünür:

Arrays.sort(ad);

Bu metod verilmiş massivi artan sırada sıralayır.

Nümunə:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};

Arrays.sort(x);

String str = Arrays.toString(x);



Dəyişən str bu qiyməti saxlayır:
"[-20, -20, -20, -2, 0, 3, 8, 11, 99, 999]"

Möhtəşəm, düzdür? Tək bir metodu çağırırsan və voylə, artıq sıralanmış massiv əldə etdin. Gözəldir.

Bu arada, siz bütün massivi deyil, onun bir hissəsini də sıralaya bilərsiniz. Çağırışı belə görünür:

Arrays.sort(ad, birinci, sonuncu);

Burada birincisonuncu — sıralamaya daxil olan ilk və son hüceyrələrin nömrələridir.

Java ənənəsinə görə, sonuncu element aralığa daxil deyil.

Nümunə:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};

Arrays.sort(x, 4, 8);
String str = Arrays.toString(x);


Dəyişən str bu qiyməti saxlayır:
"[11, -2, 3, 0, -20, -20, 8, 999, 99, -20]"

Java-da massivlərin sıralanması üçün ən sürətli sıralama alqoritmi istifadə olunur — QuickSort. Onun sürəti massiv ölçüsündən asılıdır və N*Log(N) düsturu ilə təyin olunur.

1000 elementdən ibarət massiv üçün sıralamada təxminən 3_000 müqayisə yerinə yetirilir. Bir milyon elementdən ibarət massiv sıralanarkən təxminən 6 milyon müqayisə yerinə yetirilir.



5. Arrays.binarySearch() metodu

Və nəhayət, Arrays sinfinin ən maraqlı metodlarından biri olan bu metod massivin daxilində verilmiş qiyməti axtara bilir. Bu, adi bir axtarış deyil, buna binar axtarış deyilir. Əsas ideya budur:

  • Əvvəlcə massiv çeşidlənir
  • Sonra massivdəki orta element axtarılan elementlə müqayisə olunur.
  • Əgər axtarılan orta elementdən böyükdürsə, axtarış massivin sağ tərəfində davam edir.
  • Əgər axtarılan orta elementdən kiçikdirsə, axtarış massivin sol tərəfində davam edir

Massiv çeşidləndiyi üçün bir müqayisə ilə massivin yarısını ata bilirik. Sonrakı addımda daha bir yarısını atırıq və s.

Bu yanaşma binar axtarışı çox sürətli edir. Milyon (!) elementdən ibarət massivdə istənilən elementin indeksini cəmi 20 müqayisə ilə tapa bilər. Bu yanaşmanın mənfi tərəfi odur ki, əvvəlcə massiv çeşidlənməlidir və bu da vaxt tələb edir.

Onun istifadəsi belə görünür:

int index = Arrays.binarySearch(ad, qiymət);

Burada ad — artıq çeşidlənmiş şəkildə ötürülmüş massiv adıdır (məsələn, Arrays.sort() funksiyası ilə). qiymət — massivdə axtarılan elementdir. Metod nəticə qaytarır — massivdə axtarılan elementin indeksi (massiv hüceyrəsinin nömrəsi).

Nümunələr:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};
Arrays.sort(x);

int index1 = Arrays.binarySearch(x, 0);
int index2 = Arrays.binarySearch(x, -20);
int index3 = Arrays.binarySearch(x, 99);
int index4 = Arrays.binarySearch(x, 5);
x aşağıdakıları ehtiva edir:
{-20, -20, -20, -2, 0, 3, 8, 11, 99, 999}

4
1 (həmçinin 02 indeksləri də uyğun gəlir)
8
-7

Əgər massivdə axtarılan elementlər bir neçə dəfə təkrarlanırsa, nəticə kimi onlardan birinin nömrəsi qaytarılacaq (məsələn, ən birinci və ya ən sonuncu olması zəmanət edilmir).

Əgər element massivdə tapılmazsa, indeks mənfi olacaq.



6. Arrays sinfi haqqında Oracle sənədlərinə keçid

Əgər çox maraqlanırsansa, Arrays sinfi haqqında tam məlumatı və onun bütün metodlarını Oracle veb-saytında rəsmi sənədləşmədə oxuya bilərsən:

https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/util/Arrays.html

Məsələn, Arrays.mismatch()Arrays.compare() metodları haqqında oxuya bilərsən. Ola bilər ki, onlar sənin üçün nə isə faydalı olacaq.

Həmçinin metodların sayı səni qorxutmasın – hər metodun 5-10 nüsxəsi var ki, bunlar yalnız parametr tipləri ilə fərqlənir.


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