JavaRush /Java Blogu /Random-AZ /Java-da massivlər haqqında bir şey

Java-da massivlər haqqında bir şey

Qrupda dərc edilmişdir
Salam! Əvvəllər təlim zamanı biz tək obyektlərlə (yaxud primitiv növlərlə) işləyirdik. Bəs bir obyektlə deyil, bütöv bir qrupla işləmək lazımdırsa? Məsələn, biz şirkətimizdəki bütün işçilərin doğum günlərinin siyahısını yaratmaq istəyirik. O, məsələn, formatda 30 sətirdən ibarət olmalıdır: "Andrey Petrov, 25 yanvar." Burada bizə xüsusi məlumat strukturu, massiv kömək edəcək. Massivi real həyatdakı obyektlərlə müqayisə etsəniz, onun strukturu xanaları olan bank anbarına çox bənzəyir: Java-da massivlər haqqında bir şey - 1Massiv də xanalardan ibarətdir. Hər hüceyrəyə bir şey qoya bilərsiniz. Bu halda, məzmuna daxil olmaq üçün hüceyrə nömrəsini bilməlisiniz. Massiv belə yaradılmışdır:
public class Main {

   public static void main(String[] args) {

       String [] birthdays = new String[10]; // array of Java strings

   }
}
Burada 10 xanadan ibarət massiv yaratdıq. Dərhal serialın bəzi xüsusiyyətlərinə diqqət yetirə bilərsiniz:
  1. O, ciddi şəkildə müəyyən edilmiş tipli məlumatları saxlayır. Əgər əvvəlcə sətir massivi yaratsaq String, onda başqa heç nə saxlaya bilməyəcəyik. Məlumat növü massiv yaradılarkən müəyyən edilir. Onu müştərinin istədiyi hər şeyi saxlaya biləcəyi seyfdən fərqləndirən cəhət budur.
  2. Massiv primitiv tipli (məsələn, int), sətirlərin ( String) və ya eyni sinif obyektlərinin məlumatlarını saxlaya bilər. Daha doğrusu, hətta obyektlərin özləri deyil, bu obyektlərə keçidlər.
  3. Yaratma zamanı massivin ölçüsü müəyyən edilməlidir. Siz onu daha sonra dəqiqləşdirə və ya yaratdıqdan sonra ölçüsünü dəyişə bilməyəcəksiniz.
[]Java ifadənin hər iki tərəfində kvadrat mötərizələrdən istifadə etməklə massivin yaradıldığını göstərir . Onlar istinad dəyişəninin adından əvvəl və ya sonra göstərilə bilər - bu hər iki şəkildə işləyəcək:
//Java arrays of strings, two syntaxes
String [] birthdays = new String[10];
String birthdays [] = new String[10];
Əgər massivə nəsə yazmaq istəyirsinizsə, dəyərin yazılacağı xananın nömrəsini göstərməlisiniz. Massiv xanalarının nömrələri 0-dan başlayır. Sıfırdan başlayaraq proqramlaşdırmada ümumi təcrübədir. Nə qədər tez öyrəşsən, bir o qədər yaxşıdır :) Yəni massivinJava-da massivlər haqqında bir şey - 2 birinci xanasına müəyyən dəyər qoymaq istəyirsinizsə , bu belə edilir:
public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Lena Eliseeva, March 12";
   }
}
İndi həmkarlarımızın ad günlərini ehtiva edən massivimizin ilk xanasında Lenanın doğum günü olan bir sətir var. Bənzətmə ilə başqa dəyərlər də əlavə edə bilərsiniz:
public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Lena Eliseeva, March 12";
       birthdays[1] = "Kolya Romanov, May 18";
       birthdays[7] = "Olesya Ostapenko, January 3";
   }
}
Diqqət yetirin: səkkizinci kameraya Olesyanın ad gününü əlavə etdik (7 nömrəli kameranın niyə səkkizinci olduğunu unutmusunuz?). Bütün digər hüceyrələr doldurulmasa da. Dəyərləri ardıcıllıqla sıraya yazmaq lazım deyil - belə bir məhdudiyyət yoxdur. Digər tərəfdən, ardıcıllıqla yazsanız, boş və işğal edilmiş hüceyrələrin sayını izləmək daha asan olacaq və massivdə heç bir "deşik" qalmayacaq. Əgər siz bank xanasında olduğu kimi massiv xanasının məzmununu əldə etmək istəyirsinizsə, onun nömrəsini bilməlisiniz. Bu belə edilir:
public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Lena Eliseeva, March 12";
       birthdays[1] = "Kolya Romanov, May 18";
       birthdays[7] = "Olesya Ostapenko, January 3";

       String olesyaBirthday = birthdays[7];
       System.out.println(olesyaBirthday);
   }
}
Konsol çıxışı:

Олеся Остапенко, 3 января
Biz dəyişən yaratdıq Stringvə tərtibçiyə dedik: “Massivdə indeksi 7 olan xananı tapın birthdaysvə orada saxlanılan dəyəri dəyişənə təyin edin String olesyaBirthday.” Məhz bunu etdi.

Java massivinin uzunluğu

Massivlə işləyərkən onun uzunluğunu xüsusi xüsusiyyətdən istifadə edərək asanlıqla öyrənə bilərsiniz - length.
public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Lena Eliseeva, March 12";
       birthdays[1] = "Kolya Romanov, May 18";
       birthdays[7] = "Olesya Ostapenko, January 3";

       int birthdaysLength = birthdays.length;
       System.out.println(birthdaysLength);
   }
}
Konsol çıxışı:

10
Qeyd:Mülk lengthdoldurulmuş xanaların sayını deyil, massivin ölçüsünü saxlayır. Massivimiz yalnız 3 dəyər saxlayır, lakin biz onu yaradanda onun üçün size = 10 təyin etdik. Bu sahənin qaytardığı dəyərdir length. Bu niyə faydalı ola bilər? Məsələn, bütün doğum günlərinin siyahısını konsolda çap etmək istəyirsinizsə (heç kimin unudulmadığını yoxlamaq üçün), bunu bir sadə döngədə edə bilərsiniz:
public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Lena Eliseeva, March 12";
       birthdays[1] = "Kolya Romanov, May 18";
       birthdays[2] = "Vika Ignatova, July 12";
       birthdays[3] = "Denis Kozlov, September 7";
       birthdays[4] = "Maxim Maslennikov, November 9";
       birthdays[5] = "Roman Baranov, August 14";
       birthdays[6] = "Valery Pyatkina, April 1";
       birthdays[7] = "Olesya Ostapenko, January 3";
       birthdays[8] = "Kostya Gurko, October 19";
       birthdays[9] = "Seryozha Naumov, May 3";

       for (int i = 0; i < birthdays.length; i++) {
           System.out.println(birthdays[i]);
       }
   }
}
Döngədə ibaşlanğıcda sıfıra bərabər olan dəyişən yaradırıq. Hər keçiddə i indeksli xananı massivimizdən götürüb onun dəyərini konsola çap edirik. Döngü 10 iterasiya edəcək və i dəyərləri 0-dan 9-a qədər artacaq - yalnız massivimizin hüceyrələrinin indekslərinə görə! birthdays[0]Bu yolla biz konsoldan bütün dəyərləri çap edəcəyik.Əslində birthdays[9] massivi fərqli şəkildə yaratmağın yolları var. Məsələn, rəqəmlər massivi intbelə yaradıla bilər:
public class Main {

   public static void main(String[] args) {
       int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
   }
}
Bu üsul "sürətli başlatma" adlanır. Bu, olduqca rahatdır ki, biz dərhal bir massiv yaradırıq və onu dəyərlərlə doldururuq. Massivin ölçüsünü açıq şəkildə göstərməyə ehtiyac yoxdur - lengthsürətli başlatma zamanı sahə avtomatik olaraq doldurulacaq.
public class Main {

   public static void main(String[] args) {
       int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
       System.out.println(numbers.length);
   }
}
Konsol çıxışı:

9

Java obyekt massivi

Siz artıq eşitmisiniz ki, obyektlərin massivləri və primitivlər massivləri yaddaşda fərqli şəkildə saxlanılır. Məsələn, üç obyektdən ibarət massiv götürək Cat:
public class Cat {

   private String name;

   public Cat(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

       Cat[] cats = new Cat[3];
       cats[0] = new Cat("Thomas");
       cats[1] = new Cat("Hippopotamus");
       cats[2] = new Cat("Philip Markovich");
   }
}
Burada başa düşmək üçün bir neçə şey var:
  1. Primitivlər vəziyyətində, Java massivləri bir çox xüsusi dəyərləri (məsələn, rəqəmlər int) saxlayır. Obyektlərə gəldikdə, massiv çoxlu istinadları saxlayır. Massiv catshər birində obyektə istinad olan üç xanadan ibarətdir Cat. Bağlantıların hər biri yaddaşda həmin obyektin saxlandığı ünvana işarə edir.
  2. Massiv elementləri yaddaşda bir blokda saxlanılır. Bu, onlara daha səmərəli və tez daxil olmaq üçün edilir. Beləliklə, keçid catsyaddaşda bütün obyektlərin - massivin elementlərinin saxlandığı bloka işarə edir. A cats[0]- bu blok daxilində müəyyən bir ünvana.
Java-da massivlər haqqında bir şey - 3Anlamaq lazımdır ki, massiv təkcə obyektləri saxlaya bilməz, özü də bir obyektdir.

Massivlər massivi və ya ikiölçülü massiv

Buna əsaslanaraq, biz sualla qarşılaşırıq - məsələn, sətirlər və ya rəqəmlər massivi deyil, massivlər yarada bilərikmi? Və cavab olacaq - bəli, edə bilərik! Massiv onun daxilində istənilən obyekti, o cümlədən digər massivləri saxlaya bilər. Belə bir massiv ikiölçülü adlanacaq. Əgər onu bir şəkildə təsvir etsəniz, adi bir masaya çox bənzəyəcək. Məsələn, biz hər biri 10 xana olan 3 ədəd massivi saxlayacaq massiv yaratmaq istəyirik int. Bu belə görünəcək: Java-da massivlər haqqında bir şey - 4Hər bir sətir ədədlər massivini təmsil edir int. Birinci massivdə 1-dən 10-a qədər rəqəmlər, ikincisi -1-dən -10-a qədər, üçüncüsü - təsadüfi ədədlər toplusudur. Bu massivlərin hər biri ikiölçülü massivimizin xanasında saxlanılır. Kodda iki ölçülü massivin işə salınması belə görünür:
public static void main(String[] args) {
   Cat[][] cats = new Cat[3][5];
}
İki ölçülü pişiklər massivimiz hər biri 5 hüceyrədən ibarət 3 massiv saxlayır. Obyektimizi ikinci massivin üçüncü xanasına qoymaq istəsək, bunu belə edirik:
public static void main(String[] args) {
   Cat[][] cats = new Cat[3][5];
   cats[1][2] = new Cat("Fluff");
}
[1]ikinci massivi göstərir və [2]bu massivin üçüncü xanasına işarə edir. İki ölçülü massiv bir neçə massivdən ibarət olduğundan, onu keçmək və bütün dəyərləri konsola çap etmək (və ya bütün xanaları doldurmaq) üçün bizə ikiqat, iç-içə döngə lazımdır:
for (int i = 0; i < cats.length; i++) {
   for (int j = 0; j < cats[i].length; j++) {
       System.out.println(cats[i][j]);
   }
}
Xarici döngədə (dəyişən i) biz ikiölçülü massivimizi təşkil edən bütün massivləri növbə ilə keçirik. Daxili döngədə (dəyişən j) hər massivin bütün xanalarını təkrarlayırıq. Nəticədə konsolda əvvəlcə obyekt (birinci massiv, birinci xana), ikinci obyekt isə (birinci massiv, ikinci xana) cats[0][0]göstəriləcək . cats[0][1]Birinci massiv tükəndikdə, , cats[1][0], cats[1][1]cats[1][2]s. çıxacaq. Yeri gəlmişkən, sürətli başlatma iki ölçülü massivlər üçün də mövcuddur:
int[][] numbers = {{1,2,3}, {4,5,6}, {7,8,9}};
Normalda biz ikiölçülü massivi numberskimi yazardıq int[3][3], lakin bu metod bizə dərhal dəyərləri təyin etməyə imkan verir. Niyə iki ölçülü massiv lazım ola bilər? Məsələn, onun köməyi ilə məşhur "Döyüş gəmisi" oyununu asanlıqla yenidən yarada bilərsiniz: Java-da massivlər haqqında bir şey - 5"Döyüş gəmisi" ndə oyun sahəsinin quruluşu elədir ki, onu asanlıqla təsvir etmək olar: 10 massivdən, hər biri 10 hüceyrədən ibarət iki ölçülü massiv. . Siz iki belə massiv yaradırsınız - özünüz və rəqibiniz üçün:
int [][] seaBattle = new int[10][10];
int [][] seaBattle2 = new int[10][10];
*Gəmilərinizin yerləşdiyi xanaları bəzi dəyərlərlə (məsələn, rəqəmlər və ya işarələr) doldurursunuz , sonra siz və rəqibiniz növbə ilə hüceyrə nömrələrinə zəng edirsiniz:
  • seaBattle[6][5]!
  • Keçmiş! seaBattle2[6][6]!
  • Yaralı!
  • seaBattle2[6][7]!
  • Yaralı!
  • seaBattle2[6][8]!,
  • Öldürüldü!

Massivlər haqqında əlavə resurslar

Massivlər haqqında daha çox bilmək istəyirsiniz? Zəhmət olmasa aşağıdakı məqalələrə nəzər salın. Bu mövzuda çox maraqlı və faydalı məlumatlar var.
  1. Java-da massivlər - massivlər, onların yaradılması, işə salınması və istifadəsi haqqında ətraflı məqalə. Nümunələr ilə.
  2. Arrays sinfi və onun istifadəsi - məqalədə sinfin bəzi üsulları təsvir edilmişdirArray
  3. Massivlər massivlərə həsr olunmuş ilk JavaRush mühazirəsidir.
  4. Çoxölçülü massivlər - nümunələrlə çoxölçülü massivlər haqqında ətraflı məqalə.
  5. Sıfır uzunluqlu massivi qaytarın, null deyil - Effektiv Proqramlaşdırma müəllifi Joshua Bloch boş massivləri necə daha yaxşı qaytarmaq barədə danışır.
Bu, massivlərlə ilk tanışlığımızı yekunlaşdırır, lakin bu, onlarla qarşılıqlı əlaqənin yalnız başlanğıcıdır. Növbəti mühazirələrdə onlardan istifadə etməyin maraqlı yollarını görəcəyik, həmçinin bu məlumat strukturu ilə daha rahat işləmək üçün Java-nın hansı daxili funksiyalara malik olduğunu öyrənəcəyik :)
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION