Saturday, June 12, 2021

Viết chương trình Copy Array trong java

Trong hướng dẫn này, bạn sẽ tìm hiểu về Copy Array trong java với các cách khác nhau mà bạn có thể sử dụng để sao chép mảng (cả một chiều và hai chiều) trong Java với sự trợ giúp của các ví dụ.

Trong lập trình java, chúng ta có thể sao chép một mảng này vào một mảng khác. Có một số kỹ thuật bạn có thể sử dụng để sao chép mảng trong Java.

Copy Array trong java

Sao chép mảng bằng toán tử gán

Sau đây là một ví dụ Copy array trong java

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 + ", ");

        }

    }

}

Kết quả:

1, 2, 3, 4, 5, 6

Trong ví dụ trên, chúng ta đã sử dụng toán tử gán (=) để sao chép một mảng có tên là các số sang một mảng khác có tên là Số dương.

Kỹ thuật này là kỹ thuật dễ nhất và nó hoạt động tốt. Tuy nhiên, có một vấn đề với kỹ thuật này. Nếu chúng ta thay đổi các phần tử của một mảng thì các phần tử tương ứng của các mảng khác cũng thay đổi theo. 

Ví dụ

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 + ", ");

        }

    }

}

Kết quả:

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

Ở đây, chúng ta có thể thấy rằng chúng ta đã thay đổi một giá trị của mảng số. Khi chúng ta in mảng positiveNumbers, chúng ta có thể thấy rằng giá trị tương tự cũng bị thay đổi.

Đó là bởi vì cả hai mảng đều tham chiếu đến cùng một đối tượng mảng. Đây là do bản sao nông cạn. Để tìm hiểu thêm về bản sao cạn, hãy truy cập bản sao nông.

Bây giờ, để tạo các đối tượng mảng mới trong khi sao chép các mảng, chúng ta cần bản sao sâu hơn là bản sao nông.

Sử dụng cấu trúc vòng lặp để sao chép mảng

Sau đây là ví dụ:

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));

    }

}

Kết quả:

[1, 2, 3, 4, 5, 6]

Trong ví dụ trên, chúng ta đã sử dụng vòng lặp for để lặp qua từng phần tử của mảng nguồn. Trong mỗi lần lặp, chúng ta đang sao chép các phần tử từ mảng nguồn sang mảng đích.

Ở đây, mảng nguồn và đích tham chiếu đến các đối tượng khác nhau (bản sao sâu). Do đó, nếu các phần tử của một mảng bị thay đổi thì các phần tử tương ứng của mảng khác không thay đổi.

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

Sao chép mảng bằng phương thức arrayycopy ()

Trong Java, lớp Hệ thống chứa một phương thức có tên là arrayycopy () để sao chép các mảng. Phương pháp này là một cách tiếp cận tốt hơn để sao chép mảng so với hai phương pháp trên.

Phương thức arrayycopy () cho phép bạn sao chép một phần cụ thể của mảng nguồn sang mảng đích. 

Ví dụ:

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

Giải thích:

  • src: mảng nguồn bạn muốn sao chép
  • srcPos: Vị trí bắt đầu (chỉ mục) trong mảng nguồn
  • dest: Mảng đích nơi các phần tử sẽ được sao chép từ nguồn
  • destPos: Vị trí bắt đầu (chỉ mục) trong mảng đích
  • length: Số phần tử cần sao chép
Hãy lấy một ví dụ:

// 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));  
    }
}
Kết quả:
n2 = [2, 3, 12, 4, 12, -2]
n3 = [0, 12, 4, 0, 0]
Trong ví dụ trên, chúng ta đã sử dụng phương thức arrayycopy (),
  • System.arraycopy (n1, 0, n2, 0, n1.length) - toàn bộ phần tử từ mảng n1 được sao chép sang mảng n2
  • System.arraycopy (n1, 2, n3, 1, 2) - 2 phần tử của mảng n1 bắt đầu từ chỉ số 2 được sao chép sang chỉ mục bắt đầu từ 1 trong mảng n3
Như bạn có thể thấy, giá trị ban đầu mặc định của các phần tử của mảng kiểu int là 0.

Sao chép mảng bằng phương thức copyOfRange ()

Chúng ta cũng có thể sử dụng phương thức copyOfRange () được định nghĩa trong lớp Mảng Java để sao chép mảng. 
Ví dụ:
// 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));   
    }
}
Kết quả:
destination1 = [2, 3, 12, 4, 12, -2]
destination2 = [12, 4, 12]
Trong ví dụ trên, hãy lưu ý dòng:
int[] destination1 = Arrays.copyOfRange(source, 0, source.length);
Ở đây, chúng ta có thể thấy rằng chúng ta đang tạo mảng đích1 và sao chép mảng nguồn vào nó cùng một lúc. Chúng tôi không tạo mảng đích1 trước khi gọi phương thức copyOfRange (). Để tìm hiểu thêm về phương pháp này, hãy truy cập Java copyOfRange.

Sao chép mảng 2d bằng cách sử dụng vòng lặp

Tương tự như mảng đơn chiều, chúng ta cũng có thể sao chép mảng 2 chiều bằng vòng lặp for.
Ví dụ:
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));  
      
    }
}
Kết quả:
[[1, 2, 3, 4], [5, 6], [0, 2, 42, -4, 5]]
Trong chương trình trên, lưu ý dòng:
System.out.println(Arrays.deepToString(destination);
Ở đây, phương thức deepToString () được sử dụng để cung cấp cách biểu diễn mảng 2 chiều tốt hơn. Để tìm hiểu thêm, hãy truy cập Java deepToString ().

Sao chép Mảng 2d bằng cách sử dụng arrayycopy ()

Để làm cho đoạn mã trên đơn giản hơn, chúng ta có thể thay thế vòng lặp bên trong bằng System.arraycopy () như trong trường hợp mảng một chiều.
Ví dụ:
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));      
    }
}
Kết quả:
[[1, 2, 3, 4], [5, 6], [0, 2, 42, -4, 5]]
Ở đây, chúng ta có thể thấy rằng chúng ta nhận được cùng một đầu ra bằng cách thay thế vòng lặp for bên trong bằng phương thức arrayycopy ().

No comments:

Post a Comment