CodeGym/Java Blogu/Rastgele/diziler sınıfı
John Squirrels
Seviye
San Francisco

diziler sınıfı

grupta yayınlandı
Tekrar merhaba! :) Bugünkü dersimizde Java'daki Arrays sınıfından bahsedeceğiz. Geçen derste, dizi adı verilen böyle bir veri yapısını tanımıştık. Bunları nasıl oluşturacağımızı ve verilerle nasıl dolduracağımızı öğrendik. Ve hafızada nasıl depolandıklarına baktık. Bugün, gerçek işte sıklıkla göreceğiniz bazı görevlere ve dizilerle çalışma örneklerine bakacağız. Örneğin, şu durumu hayal edin: 10 rasgele sayıdan oluşan bir dizimiz var.
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Görevimiz, bu diziyi artan düzende sıralamak: küçükten büyüğe. Sonunda şöyle görünmeli: [-234, -2, 16, 26, 35, 43, 92, 99, 167] Bunu nasıl yaparız? Bu görev önemsiz değil. Bunu daha önce hiç yapmadık :/ Herhangi bir fikir? Tahmin etmeye çalış. İşte bir çözüm:
  • Dizinin tüm öğelerini gözden geçirin. Her öğeyi bir sonrakiyle karşılaştırın ([0] ile [1], [1] ile [2], [2] ile [3] vb.). Mevcut eleman bir sonrakinden büyükse, onları değiştiririz ve ardından bir sonraki elemana geçeriz. Değilse, onları olduğu gibi bırakın ve devam edin
  • Böylece elemanlardan ilk geçişten sonra en büyük değerin (167) son hücrede olması garanti edilir.
  • Şimdi tüm elemanları tekrar gözden geçireceğiz, ancak bu sefer sondan bir önceki elemana [0] indeksi ile başlayacağız (en büyük sayı zaten yerinde) ve aynı karşılaştırmaları ve takasları yapacağız. Bu geçişten sonra, sondan bir önceki hücrede ikinci en büyük değere (99) sahip olacağız.
  • Bu işlemi dizi elemanlarımız kadar tekrarlayın.
Fikrimiz var. Şimdi sadece kodu yazmamız gerekiyor. Şuna benziyor: Diziler sınıfı ve kullanımı - 2
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 not in the right order,
             then swap them */
               if (numbers[j] > numbers[j + 1]) {
                   int tmp = numbers[j];
                   numbers[j] = numbers[j + 1];
                   numbers[j + 1] = tmp;
               }
           }
       }

   }
}
Uh ... Biraz karışık görünüyor -_- Genel prensip anlaşılır olsa bile, bu kadar basit bir görevi çözmek için hala oldukça fazla kod yazmamız gerekiyor. Tamam, belki de kendimizi fazla abarttık? Üstesinden geldiğimiz görev muhtemelen bizim için hala çok karmaşık. Daha basit bir şey deneyelim. Örneğin, aynı sayı dizisini alın.
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Görevimiz, içeriğini başka bir diziye kopyalamaktır.
int [] numbersCopy = new int[10];
Diziler hakkında zaten bildiklerinizi kullanarak bunu nasıl yapacağınızı düşünün. Örneğin, bir döngüde sayılar dizisini inceleyebilir ve öğelerini sırayla NumberCopy içine yazabilirsiniz :
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];
       }

   }
}
Eh, uh, burada temelde yaptık! Görünüşe göre sorunu çözdük. Ancak, bunu sık sık yapmanız gerekiyorsa, kodunuz bir sürü özdeş döngüye sahip olacaktır. Aslında, bu (ve diğer) görevler Java'nın yaratıcıları tarafından uzun süredir çözülmüştür. "Tekerleği yeniden icat etmemize" ve kendi çözümümüzü kodlamamıza gerek yok. Dizilerle çalışırken genel görevleri gerçekleştirmenize yardımcı olacak özel bir statik sınıf ( Diziler ) vardır . Java programcılarının karşılaştığı en yaygın görevleri gerçekleştirme yöntemleri bu sınıfa eklenmiştir. Örneğin ele almaya çalıştığımız bir diziyi sıralama görevi tek bir satırda çözülmüştü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));

   }
}
Arrays.sort () yöntemi diziyi sıralar. Ve algoritması bizim yazdığımız koddan çok daha verimli. Konsol çıktısı: [-234, -2, 16, 26, 35, 43, 80, 92, 99, 167] Not: Diziyi bir dizgeye dönüştürmek için Arrays sınıfının başka bir yöntemini kullandık : Arrays.toString() . Java'daki diziler, toString() yöntemini kendi başlarına geçersiz kılmaz. Yani, basitçe yazarsanız
System.out.println(numbers.toString());
Object sınıfının toString() işlevi çağrılacaktır. Bir dizi için çıktı şuna benzer: [I@4554617c Çıktının tam olarak neden bu olduğu hakkında ayrıntılara girmeyeceğiz. Asıl mesele, açıkça ihtiyacımız olan şey olmadığı. Ancak Arrays.toString() tam olarak istediğimizi yapıyor. Bu arada, Arrays sınıfı ile kopyalama da kolayca gerçekleştirilir :
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));

   }
}
Arrays.copyOf() yöntemine orijinal dizimizi (değerleri kopyalamak istediğimiz) ve içine veri kopyaladığımız yeni dizinin uzunluğunu aktarıyoruz . Bu durumda, tüm diziyi kopyalamak istediğimiz için uzunluk olarak Numbers.length'i belirttik . Yalnızca ilk birkaç öğeyi kopyalamak istiyorsak, daha küçük yeni bir dizinin uzunluğunu belirtebiliriz:
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 dizinin uzunluğu olarak 4 belirttik. Buna göre sayıların sadece ilk 4 elemanı yeni diziye kopyalanacaktır. Konsol çıktısı: [167, -2, 16, 99] Bu arada, Diziler ayrıca bir dizinin bir kısmını dizinin başından değil ortasından kopyalamanıza izin verir:
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));

   }
}
Çıktı: [16, 99, 26, 92] Sayılar, ikinci diziden ikinci (dahil) öğeden altıncı (dahil değil) öğeye kadar yeni diziye kopyalandı. Ayrıca iki diziyi karşılaştırmamız gerekebilir. toString() yönteminde olduğu gibi , dizilerin kendileri equals() yöntemini geçersiz kılmaz. Yani onları bu şekilde karşılaştırmaya çalışırsak
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));
   }
}
sonra yanlış oluyoruz. Bunun nedeni , başvuruları karşılaştıran Object.equals() öğesinin çağrılacak olmasıdır. Ve tabii ki farklılar! Ama ihtiyacımız olan dizi içeriklerini karşılaştırmak, referansları değil. Arrays sınıfı , tam olarak istediğimizi yapmasını sağlamak için equals() yöntemini geçersiz kılar :
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));
   }
}
Çıktı: true Bu arada, Arrays sınıfı yalnızca sıradan dizilerle değil, iki boyutlu dizilerle de çalışır:
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?");
       System.out.println(Arrays.deepEquals(numbers, numbersCopy));

       System.out.println(Arrays.deepToString(numbersCopy));
   }
}
Çıktı: Bu iki boyutlu diziler eşit mi? true [[1, 2, 3], [4, 5, 6], [7, 8, 9]] Gördüğünüz gibi Arrays.copyOf () yöntemi iki boyutlu bir diziyi kopyalayabildi. Ve sınıfın iki boyutlu dizileri karşılaştırmak ve görüntülemek için özel yöntemleri vardır: deepEquals ve deepToString() . Gelecekte, Java'nın yaratıcılarının programcıların sıklıkla karşılaştıkları pek çok durumu öngördüklerini ve onlar için dilde hazır çözümler uyguladıklarını defalarca görecek (ve buna sevineceksiniz). Bu çözümleri kullanmak, tekerleği yeniden icat etmekten çok daha kolay ve kullanışlı, değil mi? :) Oracle web sitesindeki Arrays sınıfının belgelerini okuduğunuzdan emin olun . çalışmalarınızda İyi şanslar!
Yorumlar
  • Popüler
  • Yeni
  • Eskimiş
Yorum bırakmak için giriş yapmalısınız
Bu sayfada henüz yorum yok