MERHABA! Daha önce eğitiminizde, tek nesnelerle (ve ilkel türlerle) çalıştık. Peki ya tek bir nesne yerine bütün bir nesne grubuyla çalışmamız gerekirse? Örneğin, şirketimizdeki tüm çalışanların doğum günlerinin bir listesini oluşturmak istediğimizi varsayalım. Aşağıdaki şekilde biçimlendirilmiş 30 dize içermelidir: "Sarah Huffman, 25 Ocak" Dizi adı verilen özel bir veri yapısından yararlanacağız . Bir diziyi gerçek bir nesneyle karşılaştırırsak, kasalı bir banka kasasına çok benzer: Diziler hakkında bir şey - 1Bir dizi aynı zamanda "kutulardan" oluşur. Her kutuya bir şey (bir öğe) koyabilirsiniz. Bir öğeye erişmek için kutu numarasını (dizin) bilmeniz gerekir. Bir dizi şu şekilde oluşturulur:

public class Main {

   public static void main(String[] args) {

       String [] birthdays = new String[10];
      
   }
}
Burada 10 elemanlı bir dizi oluşturuyoruz. Dizinin bazı özelliklerini hemen not edebilirsiniz:
  1. İyi tanımlanmış bir veri tipinin öğelerini saklar . Bir String dizisi oluşturursak, içinde başka bir şey depolayamayız. Veri türü, dizi oluşturulduğunda belirtilir . Bu, kasadan (bir müşterinin istediğini saklayabileceği) farklı olduğu yerdir.

  2. Dizi oluşturulduğunda boyutu belirtilmelidir . Dizi oluşturulduktan sonra bunu belirtemez veya boyutunu değiştiremezsiniz .
Bir dizi oluşturduğumuz, ifadenin her iki yanındaki köşeli parantezlerle belirtilir. Referans değişkenin adından önce veya sonra belirtilebilirler. Her iki şekilde de işe yarayacak:

String [] birthdays = new String[10];
String birthdays [] = new String[10];
Bir diziye bir şey yazmak istiyorsanız, değerin yazılacağı kutunun dizinini belirtmeniz gerekir. Bir dizideki kutular 0'dan başlayarak numaralandırılır. Sıfırdan başlayarak saymak, programlamada çok yaygın bir uygulamadır. Ne kadar hızlı alışırsanız o kadar iyi :) Bunun anlamı, ilk kutuyaDiziler hakkında bir şey - 2 bir değer koymak istiyorsanız , şunu yapın:

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
   }
}
Artık Jana'nın doğum günü, çalışan doğum günleri dizimizin ilk hücresinde saklanıyor: Benzer şekilde başka değerler de ekleyebilirsiniz:

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[7] = "Rosie Mills, January 3";
   }
}
Sekizinci kutuya Rosie'nin doğum gününü eklediğimize dikkat edin (7 No.lu Kutunun neden sekizinci kutu olduğunu unutmadınız, değil mi?) . Diğer tüm hücreleri doldurmadığımızı görebilirsiniz. Sırayla bir diziye değerler yazmak zorunda değiliz. Böyle bir zorunluluk yok. Elbette öğeleri sırayla yazmak, kaç kutunun boş ve kaç kutunun dolu olduğunu takip etmeyi çok daha kolaylaştırır ve dizinin "deliklere" sahip olmasını engeller. Kutulardan birinin içeriğini almak istiyorsanız, o zaman (tıpkı bir kasada olduğu gibi) numarasını bilmeniz gerekir. Bu şekilde yapılır:

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[7] = "Rosie Mills, January 3";

       String rosieBirthday = birthdays[7];
       System.out.println(rosieBirthday);
   }
}
Konsol çıktısı: Rosie Mills, 3 Ocak Bir değişken oluşturduk Stringve derleyiciye şunu söyledik: " Doğum günleri dizisinde dizin 7'ye sahip kutuyu bulun ve orada bulunan değeri rosieBirthdayString değişkenine atayın ". Ve yaptığı tam olarak buydu. Dizilerle çalışırken, uzunluklarını özel bir özellik kullanarak kolayca bulabiliriz: uzunluk .

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[7] = "Rosie Mills, January 3";

       int birthdaysLength = birthdays.length;
       System.out.println(birthdaysLength);
   }
}
Konsol çıktısı: 10 Not: Bu lengthözellik, dolu kutu sayısını değil dizi boyutunu saklar. Dizimiz sadece 3 değer saklıyor ama biz onu oluştururken boyutunu 10 olarak belirtmiştik. Ve bu tam olarak alanın döndürdüğü değerdir length. Bu neden işe yarar? Pekala, tüm doğum günlerinin bir listesini görüntülemek istediğinizi varsayalım (kimsenin unutulmadığını doğrulamak için). Bunu tek bir basit döngüde yapabilirsiniz:

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[2] = "Jeremiah Leonard, July 12";
       birthdays [3] = "Kenny Russo, September 7";
       birthdays[4] = "Tommie Barnes, November 9";
       birthdays [5] = "Roman Baranov, August 14";
       birthdays [6] = "Chanice Andersen, April 1";
       birthdays[7] = "Rosie Mills, January 3";
       birthdays [8] = "Keenan West, October 19";
       birthdays [9] = "Abraham McArthur, May 3";

       for (int i = 0; i < birthdays.length; i++) {
           System.out.println(birthdays[i]);
       }
   }
}
Döngüde, isıfır olarak başlatılan değişkeni bildiririz. Her geçişte, dizimizden i indeksine sahip elemanı alır ve değerini gösteririz. Döngü 10 yineleme yapacak ve i 0'dan 9'a yükselecek ve sayılar dizimizin öğelerinin indeksleri olacak! Sonuç olarak, doğum günleri[0] ile doğum günleri[9] arasındaki tüm değerleri göstereceğiz Aslında, bir dizi oluşturmanın başka bir yolu daha var. intÖrneğin, şöyle bir s dizisi oluşturabilirsiniz :

public class Main {

   public static void main(String[] args) {
       int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
   }
}
Bu tekniğe "kısayol başlatma" denir. Oldukça uygundur, çünkü aynı anda bir dizi oluşturup onu değerlerle dolduruyoruz. Dizi boyutunu açıkça belirtmek zorunda değiliz: kısayol başlatma ile alan lengthotomatik olarak ayarlanır.

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 çıktısı: 9 Şimdi dizilerin bellekte nasıl depolandığı hakkında biraz bilgi verelim. Diyelim ki üç Catnesneden oluşan bir dizimiz var:

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("Behemoth");
       cats[2] = new Cat("Lionel Messi");
   }
}
Burada birkaç şeyi anlamanız gerekiyor:
  1. Primitifler söz konusu olduğunda, bir dizi bir dizi özel değeri (örn. ints) saklar. Nesneler söz konusu olduğunda, bir dizi bir dizi referansı saklar .
    Dizi cats, her biri bir nesneye referansCat olan üç öğeden oluşur . Referansların her biri, karşılık gelen nesnenin saklandığı hafıza adresine işaret eder.

  2. Dizi öğeleri, bellekte tek bir blok halinde düzenlenir. Bu, hızlı ve verimli bir şekilde erişilmelerini sağlamak için yapılır.
Böylece, catstüm nesnelerin (dizi öğelerinin) depolandığı bellek bloğuna başvurur. Cats[0]bu blok içinde belirli bir adrese başvurur. Diziler hakkında bir şey - 3 Bir dizinin sadece nesneleri depolamadığını anlamak önemlidir: o bir nesnenin kendisidir. Bu, bizi yalnızca dizi veya sayı dizisini değil, aynı zamanda dizi dizilerini de oluşturup oluşturamayacağımızı sorgulamaya götürür . Ve cevap evet, yapabiliriz! Bir dizi, diğer diziler de dahil olmak üzere herhangi bir nesneyi saklayabilir. Böyle bir diziye iki boyutlu denir . Görsel olarak ifade edecek olursak, sıradan bir tabloya çok benzer olacaktır. Her biri 10 s depolayabilen 3 diziden oluşan bir dizi oluşturmak istediğimizi varsayalım int. Şöyle görünecek:
Diziler hakkında bir şey - 4
Her satır bir intdiziyi temsil eder. İlk dizi 1'den 10'a kadar sayıları, ikinci dizi - -1'den -10'a ve üçüncü dizi rasgele sayılar içerir. Bu dizilerin her biri, iki boyutlu dizimizin kutularında saklanır. Kodda, iki boyutlu bir dizinin başlatılması şöyle görünür:

public static void main(String[] args) {
   Cat[][] cats = new Cat[3][5];
}
İki boyutlu dizi kedilerimiz, her dizide 5 kutu olacak şekilde 3 dizi depolar . İkinci dizinin üçüncü kutusuna bir nesne koymak istiyorsak , şunu yaparız:

public static void main(String[] args) {
   Cat[][] cats = new Cat[3][5];
   cats[1][2] = new Cat("Fluffy");
}
[1]ikinci diziyi belirtir ve [2]o dizinin üçüncü kutusunu belirtir. İki boyutlu bir dizi birkaç diziden oluştuğundan, içinde yineleme yapmak ve tüm değerlerini görüntülemek (veya tüm öğelerini doldurmak) için iç içe geçmiş bir döngüye ihtiyacımız var:

for (int i = 0; i < cats.length; i++) {
   for (int j = 0; j < cats[i].length; j++) {
       System.out.println(cats[i][j]);
   }
}
Dış döngüde (değişken i), iki boyutlu dizimizdeki tüm dizileri yineleriz. İç döngüde (değişken j), her dizinin tüm öğelerinden geçiyoruz. Sonuç olarak, önce önce gösterilecek, ches[0][1] (birinci dizi, ikinci eleman) ardından kediler[0][0] (ilk dizi, ilk eleman) gösterilecektir. İlk diziyi inceledikten sonra, videos [1][0] , Cats[1][1] , Cats[1][2] vb. Bu arada, iki boyutlu diziler de destekler kısayol başlatma:

int[][] numbers = {{1,2,3}, {4,5,6}, {7,8,9}};
numbersNormalde, iki boyutlu diziyi bir olarak bildiririz int[3][3], ancak bu kestirme yol, değerleri hemen belirlememizi sağlar. Neden iki boyutlu bir diziye ihtiyacınız olsun ki? Ünlü "Battleship" oyununu kolayca yeniden yaratmak için birini kullanabilirsiniz: Diziler hakkında bir şey - 5 "Battleship"te oyun alanının yapısı kolayca tanımlanabilir: her biri 10 elemanlı 10 diziden oluşan iki boyutlu bir dizi. Bu dizilerden iki tane oluşturuyorsunuz (biri sizin için, diğeri rakibiniz için)

int[][] battleshipBoard1 = new int[10][10];
int[][] battleshipBoard2 = new int[10][10];
gemilerinizin konumuna karşılık gelen öğeleri doldurmak için bazı değerler (örneğin sayılar veya semboller) kullanın ve ardından belirli öğeler için koordinatları sırayla söyleyin:
  • savaş gemisiBoard1[0][2]!
  • Kayıp! savaş gemisiBoard2[2][4]!
  • Vurmak!
  • savaş gemisiBoard2[2][5]!
  • Vurmak!
  • savaş gemisiBoard2[2][6]!,
  • battı!
Bu, dizilere ilk girişimizi sonlandırıyor, ancak bu, onlarla etkileşimimizin yalnızca başlangıcı. Sonraki derslerde, bunların ilginç kullanım yollarını göreceğiz ve Java'nın hangi yerleşik işlevlerin bu veri yapısıyla daha rahat çalışmamıza izin verdiğini öğreneceğiz :)