JavaRush /Java Blogu /Random-AZ /Massivlər sinfi və onun istifadəsi

Massivlər sinfi və onun istifadəsi

Qrupda dərc edilmişdir
Birdaha salam! :) Keçən dərsdə biz massiv (Java massivi) kimi verilənlər strukturu ilə tanış olduq, massivlərin necə yaradılmasını, verilənlərlə doldurulmasını öyrəndik, həmçinin onların yaddaşda saxlanmasını öyrəndik. Bu gün biz real işdə tez-tez rastlaşacağınız bəzi tapşırıqlara və massivlərlə işləmək nümunələrinə baxacağıq. Məsələn, bu vəziyyəti təsəvvür edin: təsadüfi qaydada yazılmış 10 ədəddən ibarət massivimiz var.
//array Java, example
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Bizim vəzifəmiz bu massivi artan ardıcıllıqla sıralamaqdır: ən kiçikdən böyüyə doğru. Sonda bu belə görünməlidir:
[-234, -2, 16, 26, 35, 43, 80, 92, 99, 167]
Bunu necə edirik? Tapşırıq qeyri-ciddidir, biz bunu əvvəllər etməmişik :/ Hər hansı bir fikir? Təxmin etməyə çalışın. Burada edə biləcəyimiz şeylər, məsələn:
  • Massivin bütün elementləri arasında təkrarlayın. Hər bir elementi növbəti ilə müqayisə edin ( [0]ilə [1], [1]ilə [2], [2]ilə [3]və s.). Cari massiv elementi növbəti elementdən böyükdürsə, biz onları dəyişdirib növbəti elementə keçirik. Yoxdursa, olduğu kimi buraxın və davam edin.

  • Beləliklə, massivin elementləri arasından birinci keçiddən sonra ən böyük qiymətin (167) sonuncu xanada olmasına zəmanət verilir.

  • İndi index olan elementdən başlayaraq, [0]lakin sondan əvvəlki elementə qədər (ən böyük rəqəm artıq öz yerindədir) yenidən massivin bütün elementlərini nəzərdən keçirək və eyni müqayisələri və dəyişdirmələri aparaq. 
    Sonda, sondan əvvəlki xanada biz ikinci ən yüksək qiymətə (99) sahib olacağıq.

  • Bu işi massivdə mənfi bir elementimiz olduğu qədər təkrar edək.
Massivlər sinfi və onun istifadəsi - 2İdeya ilə gəldik, kodu yazmaq qalır. Bu belə görünəcək:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       for (int i = numbers.length - 1; i > 0; i--) {
           for (int j = 0; j < i; j++) {
           /* Compare the elements in pairs,
             if they are in the wrong order,
             then swap them */
               if (numbers[j] > numbers[j + 1]) {
                   int tmp = numbers[j];
                   numbers[j] = numbers[j + 1];
                   numbers[j + 1] = tmp;
               }
           }
       }

   }
}
Uh... Bir az mürəkkəb görünür -_- Ümumi iş prinsipi aydın olsa belə, belə sadə görünən işi həll etmək üçün kifayət qədər çox kod yazmalısan. Yaxşı, bəlkə biz özümüzü çox qiymətləndirdik? Yəqin ki, üzərimizə götürdüyümüz vəzifə indiyə qədər bizim üçün çox ağırdır. Gəlin daha sadə bir şey etməyə çalışaq. Məsələn, eyni ədədlər massivini götürək.
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Bizim vəzifəmiz onun məzmununu başqa bir sıraya köçürməkdir.
int [] numbersCopy = new int[10];
Artıq malik olduğunuz massivlər haqqında biliklərdən istifadə edərək bunu necə edəcəyinizi düşünün? Siz, məsələn, massivdə dövr edə numbersvə onun elementlərini bir-bir daxil edə bilərsiniz numbersCopy:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = new int[10];

       for (int i = 0; i < numbers.length; i++) {

           numbersCopy[i] = numbers[i];
       }

   }
}
Yaxşı, biz bunu az-çox etdik! Problem həll edilmiş kimi görünür, amma yenə də: onu tez-tez yerinə yetirmək lazımdırsa, kodun bir dəstə eyni döngələri olacaq. Əslində, bu və digər problemlər çoxdan Java yaradıcıları tərəfindən həll olunub və bizim öz həllimiz üçün “təkəri yenidən ixtira etməyə” və bəzi kodlar yazmağa ehtiyac yoxdur.

Java massivləri sinfi

Xüsusi Java sinfi massivlərlə işləyərkən tipik problemləri həll etməyə kömək edəcək - Arrays. Java proqramçılarının öz işlərində qarşılaşdıqları ən ümumi problemləri həll etmək üçün bu sinifə üsullar əlavə edilmişdir. Məsələn, özümüz həll yolları tapmağa çalışdığımız massivi çeşidləmək vəzifəsi bir sətirdə həll edilə bilər:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       Arrays.sort(numbers);

       System.out.println(Arrays.toString(numbers));

   }
}
Metod Arrays.sort()massivi sıralayır. Üstəlik, ona daxil edilmiş alqoritm bunu yazdığımız koddan daha səmərəli edir. Konsol çıxışı:

[-234, -2, 16, 26, 35, 43, 80, 92, 99, 167]
Diqqət edin: massivi sətirə çevirmək üçün başqa bir sinif metodundan istifadə etdik Arrays- Arrays.toString(). Java massivlərinin özləri toString(). Yəni sadəcə yazsanız
System.out.println(numbers.toString());
toString()sinif metodu çağırılacaq Object. Massivlər vəziyyətində çıxış belə olacaq:

[I@4554617c
İndi nəticənin niyə belə olduğu barədə təfərrüata girməyəcəyik; əsas odur ki, bu, bizə lazım olan şey deyil. Lakin Arrays.toString() bizim istədiyimizi etdi. Yeri gəlmişkən, kopyalama problemimiz də sinifdə asanlıqla həll olunur Arrays:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, numbers.length);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
Metodumuza Arrays.copyOf()orijinal massivimizi (dəyərləri oradan köçürməliyik) və məlumatları kopyaladığımız yeni massivin uzunluğunu ötürürük. Bu halda biz uzunluq kimi göstərdik numbers.length, çünki Bütün massivi kopyalamaq istəyirik. Yalnız ilk bir neçə elementi kopyalamaq istəyiriksə, yeni massiv üçün daha kiçik uzunluq təyin edə bilərik:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, 4);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
Burada yeni massivin uzunluğunu 4 olaraq təyin etdik. Müvafiq olaraq, yalnız ilk 4 element numbersyeni massiləyə kopyalanacaq. Konsol çıxışı:

[167, -2, 16, 99]
Yeri gəlmişkən, əgər serialın bir hissəsini əvvəldən deyil, “ortadan” köçürmək lazımdırsa, Arraysbunu da edə bilərsiniz:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOfRange(numbers, 2,6);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
Nəticə:

[16, 99, 26, 92]
İki ( daxil olmaqla ) xanalardan altıya ( daxil deyil ) nömrələr yeni massiləyə kopyalandı. Bundan əlavə, iki massivi bir-biri ilə müqayisə etmək lazım gələ bilər. Metodda olduğu kimi toString()massivlərin özləri də metodu ləğv etmir equals(). Onları belə müqayisə etməyə çalışsaq:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(numbers.equals(numbers2));
   }
}
nəticəni alırıq false. Object.equals()Axı, bağlantıları müqayisə edən üsul çağırılacaq . Və əlbəttə ki, onlar fərqlidirlər! Amma biz keçidləri deyil, massivlərin məzmununu müqayisə etməliyik. Sinifdə bizə lazım olanı yerinə yetirən Arraysləğv edilmiş metod var :equals()
public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(Arrays.equals(numbers, numbers2));
   }
}
Nəticə:

true
Yeri gəlmişkən, sinif Arraystəkcə adi massivlərlə deyil, həm də iki ölçülü massivlərlə uğurla işləyir:
public class Main {

   public static void main(String[] args) {

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

       int[][] numbersCopy = Arrays.copyOf(numbers, numbers.length);

       System.out.println("Are these two-dimensional arrays equal to each other?");
       System.out.println(Arrays.deepEquals(numbers, numbersCopy));

       System.out.println(Arrays.deepToString(numbersCopy));
   }
}
Nəticə:

Равны ли эти двумерные массивы между собой?
true
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Gördüyünüz kimi, metod Arrays.copyOf()ikiölçülü massivin surətini çıxarmağı bacardı. Nəzərə alın ki, bu halda, ikiölçülü massivi kopyalayarkən, "dayaz surət" adlanan hadisə baş verir. Və iki ölçülü massivləri müqayisə etmək və onları konsola çıxarmaq üçün xüsusi üsullar təmin edilir - deepEqualsdeepToString(); Gələcəkdə Java yaradıcılarının proqramçıların işləyərkən qarşılaşdıqları bir çox tipik vəziyyətləri qabaqcadan gördüyünü və onlar üçün hazır həlləri dildə həyata keçirdiklərini bir dəfədən çox görəcəksiniz (və buna sevinəcəksiniz). Bu həllərdən istifadə təkərləri yenidən kəşf etməkdən daha asan və daha rahatdır, elə deyilmi? :) OracleArrays saytında sinif sənədlərini oxumağınızdan əmin olun . Təhsilinizdə uğurlar!
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION