JavaRush /Java blogi /Random-UZ /Massivlar klassi va undan foydalanish

Massivlar klassi va undan foydalanish

Guruhda nashr etilgan
Yana bir bor salom! :) O'tgan darsda biz massiv (Java massivi) kabi ma'lumotlar strukturasi bilan tanishdik , massivlarni qanday yaratishni, ularni ma'lumotlar bilan to'ldirishni o'rgandik, shuningdek ular xotirada qanday saqlanishini o'rgandik. Bugun biz ba'zi vazifalar va massivlar bilan ishlash misollarini ko'rib chiqamiz, ular siz tez-tez haqiqiy ishda duch kelasiz. Misol uchun, bu vaziyatni tasavvur qiling: bizda tasodifiy tartibda yozilgan 10 ta raqamdan iborat massiv bor.
//array Java, example
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Bizning vazifamiz ushbu massivni o'sish tartibida tartiblashdir: eng kichikdan kattagacha. Oxirida u quyidagicha ko'rinishi kerak:
[-234, -2, 16, 26, 35, 43, 80, 92, 99, 167]
Buni qanday qilamiz? Vazifa ahamiyatsiz, biz buni hech qachon qilmaganmiz :/ Har qanday fikr bormi? Taxmin qilishga harakat qiling. Mana, biz nima qila olamiz, masalan:
  • Massivning barcha elementlarini takrorlang. Har bir elementni keyingisi bilan solishtiring ( [0]bilan [1], [1]bilan [2], [2]bilan [3]va hokazo). Agar joriy massiv elementi keyingisidan katta bo'lsa, biz ularni almashtiramiz va keyingi elementga o'tamiz. Agar yo'q bo'lsa, uni avvalgidek qoldiring va davom eting.

  • Shunday qilib, massiv elementlaridan birinchi o'tgandan so'ng, eng katta qiymat (167) oxirgi katakda bo'lishi kafolatlanadi.

  • Endi indeksli elementdan boshlab yana massivning barcha elementlarini ko'rib chiqamiz, [0]lekin oxirgi elementgacha (eng katta raqam allaqachon o'z o'rnida) va bir xil taqqoslash va almashtirishlarni amalga oshiramiz. 
    Oxir-oqibat, oxirgi katakchada biz ikkinchi eng yuqori qiymatga ega bo'lamiz (99).

  • Keling, massivda minus bir element bo'lsa, shuncha marta bu ishni takrorlaymiz.
Massivlar sinfi va undan foydalanish - 2Biz g'oyani o'ylab topdik, faqat kod yozish qoladi. Bu shunday ko'rinadi:
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;
               }
           }
       }

   }
}
Hm... Bu biroz murakkab ko'rinadi -_- Umumiy ishlash printsipi aniq bo'lsa ham, bunday oddiy tuyulgan vazifani hal qilish uchun juda ko'p kod yozish kerak. Xo'sh, ehtimol biz o'zimizni ortiqcha baholaganmizmi? Balki, o'z zimmamizga olgan vazifamiz hozircha biz uchun juda og'irdir. Keling, oddiyroq narsani qilishga harakat qilaylik. Masalan, bir xil raqamlar qatorini olaylik.
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Bizning vazifamiz uning mazmunini boshqa massivga nusxalashdir.
int [] numbersCopy = new int[10];
O'ylab ko'ring, sizda mavjud bo'lgan massivlar haqidagi bilimingizdan foydalanib, buni qanday qilish kerak? Siz, masalan, massivni aylanib o'tishingiz numbersva uning elementlarini birma-bir yozishingiz mumkin 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];
       }

   }
}
Xo'sh, biz buni ozmi-ko'pmi bajardik! Muammo hal qilinganga o'xshaydi, lekin yana: agar uni tez-tez bajarish kerak bo'lsa, kod bir xil ko'chadan iborat bo'ladi. Aslida, bu va boshqa muammolar Java yaratuvchilari tomonidan uzoq vaqtdan beri hal qilingan va biz "g'ildirakni qayta ixtiro qilishimiz" va o'z yechimimiz uchun qandaydir kod yozishimiz shart emas.

Java massivlari klassi

Maxsus Java klassi massivlar bilan ishlashda odatiy muammolarni hal qilishga yordam beradi - Arrays. Ushbu sinfga Java dasturchilari o'z ishlarida duch keladigan eng keng tarqalgan muammolarni hal qilish usullari qo'shilgan. Masalan, biz o'zimiz yechim topishga harakat qilgan massivni saralash vazifasini bitta qatorda hal qilish mumkin:
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));

   }
}
Usul Arrays.sort()massivni tartiblaydi. Bundan tashqari, unga o'rnatilgan algoritm buni biz yozgan kodga qaraganda ancha samarali qiladi. Konsol chiqishi:

[-234, -2, 16, 26, 35, 43, 80, 92, 99, 167]
Iltimos, diqqat qiling: massivni satrga aylantirish uchun biz boshqa sinf usulidan foydalandik Arrays- Arrays.toString(). Java massivlarining o'zlari ni bekor qilmaydi toString(). Shunday qilib, agar siz shunchaki yozsangiz
System.out.println(numbers.toString());
toString()sinf usuli chaqiriladi Object. Massivlar bo'lsa, chiqish quyidagicha bo'ladi:

[I@4554617c
Endi biz xulosa nima uchun bunday ekanligini batafsil ko'rib chiqmaymiz, asosiysi, bu bizga kerak bo'lgan narsa emas. Lekin Arrays.toString() biz xohlagan narsani qildi. Aytgancha, bizning nusxa ko'chirish muammomiz ham sinfda osonlikcha hal qilinadi 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));

   }
}
Usulga Arrays.copyOf()biz o'zimizning asl massivimizni (biz undan qiymatlarni nusxalashimiz kerak) va ma'lumotlarni ko'chiradigan yangi massivning uzunligini o'tkazamiz. Bunday holda, biz uzunlik sifatida ko'rsatdik numbers.length, chunki Biz butun massivdan nusxa olmoqchimiz. Agar biz faqat dastlabki bir nechta elementlardan nusxa olishni istasak, yangi massiv uchun kichikroq uzunlikni belgilashimiz mumkin:
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));

   }
}
Bu yerda biz yangi massiv uzunligini 4 qilib belgilab oldik. Shunga ko'ra, numbersyangi massivga faqat dastlabki 4 ta element ko'chiriladi. Konsol chiqishi:

[167, -2, 16, 99]
Aytgancha, agar siz massivning bir qismini boshidan emas, balki "o'rtadan" nusxalashingiz kerak bo'lsa, Arraysbuni ham qilishingiz mumkin:
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));

   }
}
Xulosa:

[16, 99, 26, 92]
Ikki ( shu jumladan ) dan oltigacha ( shu jumladan emas ) katakchalar raqamlari yangi massivga ko'chirildi. Bundan tashqari, ikkita massivni bir-biri bilan solishtirishimiz kerak bo'lishi mumkin. Xuddi usulda bo'lgani kabi toString(), massivlarning o'zi ham usulni bekor qilmaydi equals(). Shunday qilib, agar biz ularni quyidagicha solishtirishga harakat qilsak:
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));
   }
}
natijaga erishamiz false. Object.equals()Axir, havolalarni taqqoslaydigan usul chaqiriladi . Va, albatta, ular boshqacha! Lekin biz havolalarni emas, balki massivlarning mazmunini solishtirishimiz kerak. Sinfda bizga kerak bo'lgan narsani bajaradigan Arraysbekor qilingan usul mavjud :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));
   }
}
Xulosa:

true
Aytgancha, sinf Arraysnafaqat oddiy massivlar bilan, balki ikki o'lchovli massivlar bilan ham muvaffaqiyatli ishlaydi:
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));
   }
}
Xulosa:

Равны ли эти двумерные массивы между собой?
true
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Ko'rib turganingizdek, usul Arrays.copyOf()ikki o'lchovli massivni nusxalash bilan kurashdi. E'tibor bering, bu holda, ikki o'lchovli massivni nusxalashda "sayoz nusxa" deb ataladigan narsa paydo bo'ladi. Va ikki o'lchovli massivlarni solishtirish va ularni konsolga chiqarish uchun maxsus usullar taqdim etiladi - deepEqualsva deepToString(); Kelajakda Java yaratuvchilari dasturchilar ishlayotganda duch keladigan ko'plab tipik vaziyatlarni oldindan ko'ra olganliklarini va ular uchun tayyor echimlarni tilda amalga oshirganliklarini bir necha bor ko'rasiz (va bundan xursand bo'lasiz). Ushbu echimlardan foydalanish g'ildiraklarni qayta ixtiro qilishdan ko'ra ancha oson va qulayroq, to'g'rimi? :) OracleArrays veb- saytida sinf hujjatlarini o'qib chiqing . O'qishlaringizga omad!
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION