Java Kopyalama Dizileri (Sistem arraycopy (), Döngü yapısı vb. Kullanarak)

Bu eğitimde, örnekler yardımıyla Java'da dizileri (hem tek boyutlu hem de iki boyutlu) kopyalamak için kullanabileceğiniz farklı yollar hakkında bilgi edineceksiniz.

Java'da bir diziyi diğerine kopyalayabiliriz. Java'da dizileri kopyalamak için kullanabileceğiniz birkaç teknik vardır.

1. Atama Operatörünü Kullanarak Dizileri Kopyalama

Bir örnek alalım

 class Main ( public static void main(String() args) ( int () numbers = (1, 2, 3, 4, 5, 6); int () positiveNumbers = numbers; // copying arrays for (int number: positiveNumbers) ( System.out.print(number + ", "); ) ) )

Çıktı :

 1, 2, 3, 4, 5, 6

Yukarıdaki örnekte, =sayı adlı bir diziyi PositiveNumbers adlı başka bir diziye kopyalamak için atama operatörünü ( ) kullandık.

Bu teknik en kolay olanıdır ve aynı zamanda işe yarar. Ancak bu teknikte bir sorun var. Bir dizinin elemanlarını değiştirirsek, diğer dizilerin karşılık gelen elemanları da değişir. Örneğin,

 class Main ( public static void main(String() args) ( int () numbers = (1, 2, 3, 4, 5, 6); int () positiveNumbers = numbers; // copying arrays // change value of first array numbers(0) = -1; // printing the second array for (int number: positiveNumbers) ( System.out.print(number + ", "); ) ) )

Çıktı :

 -1, 2, 3, 4, 5, 6

Burada, numbers dizisinin bir değerini değiştirdiğimizi görebiliriz. PositiveNumbers dizisini yazdırdığımızda, aynı değerin de değiştiğini görebiliriz.

Bunun nedeni, her iki dizinin de aynı dizi nesnesine başvurmasıdır. Bu sığ kopya yüzündendir. Sığ kopya hakkında daha fazla bilgi edinmek için sığ kopyayı ziyaret edin.

Şimdi, dizileri kopyalarken yeni dizi nesneleri oluşturmak için, sığ bir kopya yerine derin kopyaya ihtiyacımız var.

2. Dizileri Kopyalamak için Döngüsel Yapıyı Kullanma

Bir örnek alalım:

 import java.util.Arrays; class Main ( public static void main(String() args) ( int () source = (1, 2, 3, 4, 5, 6); int () destination = new int(6); // iterate and copy elements from source to destination for (int i = 0; i < source.length; ++i) ( destination(i) = source(i); ) // converting array to string System.out.println(Arrays.toString(destination)); ) )

Çıktı :

 (1, 2, 3, 4, 5, 6)

Yukarıdaki örnekte, forkaynak dizinin her bir öğesini yinelemek için döngüyü kullandık . Her yinelemede, öğeleri kaynak diziden hedef diziye kopyalıyoruz.

Burada, kaynak ve hedef dizisi farklı nesnelere (derin kopya) başvurur. Dolayısıyla, bir dizinin öğeleri değiştirilirse, başka bir dizinin karşılık gelen öğeleri değişmez.

İfadeye dikkat edin,

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

Burada, toString () yöntemi bir diziyi dizeye dönüştürmek için kullanılır. Daha fazla bilgi edinmek için toString () yöntemini (resmi Java belgeleri) ziyaret edin.

3. arraycopy () yöntemini kullanarak Dizileri Kopyalama

Java'da, System sınıfı, arraycopy()dizileri kopyalamak için adlandırılan bir yöntem içerir . Bu yöntem, dizileri kopyalamak için yukarıdaki ikisinden daha iyi bir yaklaşımdır.

arraycopy()Yöntem, hedef dizisine kaynak dizideki belirli bir bölümünü kopyalamak için izin verir. Örneğin,

 arraycopy(Object src, int srcPos,Object dest, int destPos, int length)

Buraya,

  • src - kopyalamak istediğiniz kaynak dizisi
  • srcPos - kaynak dizideki başlangıç ​​konumu (dizin)
  • dest - öğelerin kaynaktan kopyalanacağı hedef dizi
  • destPos - hedef dizideki başlangıç ​​konumu (dizin)
  • uzunluk - kopyalanacak öğe sayısı

Bir örnek alalım:

 // To use Arrays.toString() method import java.util.Arrays; class Main ( public static void main(String() args) ( int() n1 = (2, 3, 12, 4, 12, -2); int() n3 = new int(5); // Creating n2 array of having length of n1 array int() n2 = new int(n1.length); // copying entire n1 array to n2 System.arraycopy(n1, 0, n2, 0, n1.length); System.out.println("n2 = " + Arrays.toString(n2)); // copying elements from index 2 on n1 array // copying element to index 1 of n3 array // 2 elements will be copied System.arraycopy(n1, 2, n3, 1, 2); System.out.println("n3 = " + Arrays.toString(n3)); ) )

Çıktı :

 n2 = (2, 3, 12, 4, 12, -2) n3 = (0, 12, 4, 0, 0)

Yukarıdaki örnekte, arraycopy()yöntemi kullandık ,

  • System.arraycopy(n1, 0, n2, 0, n1.length) - n1 dizisindeki tüm öğeler n2 dizisine kopyalanır
  • System.arraycopy(n1, 2, n3, 1, 2) - 2 indeksinden başlayarak n1 dizisinin 2 elemanı, n3 dizisinin 1'inden başlayarak dizine kopyalanır

Gördüğünüz gibi, int türü bir dizinin öğelerinin varsayılan başlangıç ​​değeri 0'dır.

4. copyOfRange () yöntemini kullanarak Dizileri Kopyalama

Dizileri kopyalamak için Java Arrays sınıfında tanımlanan copyOfRange () yöntemini de kullanabiliriz. Örneğin,

 // To use toString() and copyOfRange() method import java.util.Arrays; class ArraysCopy ( public static void main(String() args) ( int() source = (2, 3, 12, 4, 12, -2); // copying entire source array to destination int() destination1 = Arrays.copyOfRange(source, 0, source.length); System.out.println("destination1 = " + Arrays.toString(destination1)); // copying from index 2 to 5 (5 is not included) int() destination2 = Arrays.copyOfRange(source, 2, 5); System.out.println("destination2 = " + Arrays.toString(destination2)); ) )

Çıktı

 hedef1 = (2, 3, 12, 4, 12, -2) hedef2 = (12, 4, 12)

Yukarıdaki örnekte, satıra dikkat edin,

 int() destination1 = Arrays.copyOfRange(source, 0, source.length);

Burada, hedef1 dizisini oluşturduğumuzu ve aynı zamanda kaynak diziyi ona kopyaladığımızı görebiliriz. copyOfRange()Yöntemi çağırmadan önce destination1 dizisini oluşturmuyoruz . Yöntem hakkında daha fazla bilgi edinmek için Java copyOfRange adresini ziyaret edin.

5. Döngü Kullanarak 2d Dizileri Kopyalama

Tek boyutlu diziye benzer şekilde, 2 boyutlu diziyi de fordöngüyü kullanarak kopyalayabiliriz . Örneğin,

 import java.util.Arrays; class Main ( public static void main(String() args) ( int()() source = ( (1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5) ); int()() destination = new int(source.length)(); for (int i = 0; i < destination.length; ++i) ( // allocating space for each row of destination array destination(i) = new int(source(i).length); for (int j = 0; j < destination(i).length; ++j) ( destination(i)(j) = source(i)(j); ) ) // displaying destination array System.out.println(Arrays.deepToString(destination)); ) )

Çıktı :

 ((1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5))

Yukarıdaki programda satıra dikkat edin,

 System.out.println(Arrays.deepToString(destination);

Burada deepToString()yöntem, 2 boyutlu dizinin daha iyi bir temsilini sağlamak için kullanılır. Daha fazla bilgi edinmek için Java deepToString () adresini ziyaret edin.

Arraycopy () kullanarak 2d Dizileri kopyalama

Yukarıdaki kodu daha basit hale getirmek için, iç döngüyü System.arraycopy()tek boyutlu bir dizide olduğu gibi değiştirebiliriz. Örneğin,

 import java.util.Arrays; class Main ( public static void main(String() args) ( int()() source = ( (1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5) ); int()() destination = new int(source.length)(); for (int i = 0; i < source.length; ++i) ( // allocating space for each row of destination array destination(i) = new int(source(i).length); System.arraycopy(source(i), 0, destination(i), 0, destination(i).length); ) // displaying destination array System.out.println(Arrays.deepToString(destination)); ) )

Çıktı :

 ((1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5))

Burada iç fordöngüyü arraycopy()metotla değiştirerek aynı çıktıyı aldığımızı görebiliriz .

Ilginç makaleler...