Daily Archives: 14/04/2017

Java 8 – Mảng

Mảng là một kiểu dữ liệu dùng để lưu trữ danh sách các đối tượng có kiểu dữ liệu khác. Số lượng các phần tử trong mảng là cố định.

Trong các bài trước chúng ta đã làm gặp mảng rồi, đó là tham số args trong phương thức main().

Mỗi thành phần trong mảng được gọi là một phần tử (element), mỗi phần tử sẽ được đánh số thứ tự, bắt đầu từ 0, chúng ta gọi đó là chỉ số (index) của phẩn tử, các phần tử sẽ được đọc thông qua chỉ số đó.

Trong hình trên mô phỏng một mảng có 10 phần tử, phần tử đầu tiên có chỉ số là 0 và phần tử cuối cùng là 9.

Trong Java thì chúng ta khai báo một mảng theo cú pháp:

<kiểu_dữ_liêu>[] <tên_mảng> = new <kiểu_dữ_liệu>[<độ_dài_mảng>];

Chúng ta đọc và ghi các phần tử mảng bằng cách sử dụng cặp dấu ngoặc vuông [].

Ví dụ đoạn code dưới đây sẽ tạo một mảng lưu trữ các số nguyên int và in giá trị đó ra màn hình:

class ArrayExample {
    public static void main(String[] args) {
        int[] array = new int[10];
        array[0] = 100;
        array[1] = 200;
        array[2] = 300;
        array[3] = 400;
        array[4] = 500;
        array[5] = 600;
        array[6] = 700;
        array[7] = 800;
        array[8] = 900;
        array[9] = 1000;

        System.out.println("Element 0: " + array[0]);
        System.out.println("Element 1: " + array[1]);
        System.out.println("Element 2: " + array[2]);
        System.out.println("Element 3: " + array[3]);
        System.out.println("Element 4: " + array[4]);
        System.out.println("Element 5: " + array[5]);
        System.out.println("Element 6: " + array[6]);
        System.out.println("Element 7: " + array[7]);
        System.out.println("Element 8: " + array[8]);
        System.out.println("Element 9: " + array[9]);
    }
}

Dịch và chạy ra được kết quả:

Element 0: 100
Element 1: 200
Element 2: 300
Element 3: 400
Element 4: 500
Element 5: 600
Element 6: 700
Element 7: 800
Element 8: 900
Element 9: 1000

Trong thực tế thì khi thao tác với mảng chúng ta sẽ dùng với câu lệnh lặp cho nhanh vì số lượng phần tử trong mảng có thể lên tới hàng ngàn. Chúng ta sẽ tìm hiểu câu lệnh lặp sau.

Tương tự với int, chúng ta có thể tạo mảng cho các kiểu dữ liệu khác:

byte[] byteArray;
short[] shortArray;
long[] longArray;
float[] floatArray;
double[] doubleArray;
boolean[] booleanArray;
char[] charArray;
String[] stringArray;

Cặp dấu ngoặc vuông có thể được đặt phía sau tên mảng thay vì đặt sau tên kiểu dữ liệu:

int intArray[];

Khởi tạo mảng

Trong đoạn code trên chúng ta tạo mảng bằng cách dùng toán tử new, khi sử dụng toán tử này thì chúng ta phải khai báo thêm số lượng phần tử trong mảng luôn:

int[] array = new int[10];

Tiếp theo là các dòng gán giá trị cho các phần tử:

array[0] = 100;

array[1] = 200;

Thay vào đó, chúng ta có cú pháp tạo và gán giá trị nhanh như sau:

int[] array = { 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000 };

Dùng cú pháp này chúng ta không cần phải khai ra số lượng phần tử mảng, Java sẽ tự biết số lượng thông qua các giá trị chúng ta đưa vào trong cặp dấu ngoặc nhọn {}.

Các phần tử trong một mảng ngoài chứa các giá trị như int, float, double…v.v thì chúng còn có thể là một mảng khác, mảng như thế được gọi là mảng đa chiều (multidimensional array).

Để khai báo mảng đa chiều thì chúng ta chỉ cần ghi thêm các cặp dấu ngoặc vuông, chẳng hạn [][], [][][]…v.v 2 cặp dấu ngoặc vuông được gọi là mảng 2 chiều, 3 cặp thì là 3 chiều…v.v

Ví dụ:

class MultiDArray {
    public static void main(String[] args) {
        String[][] languages = {
            {"C++", "Java"},
            {"Python", "Ruby"}   
        };
     
        System.out.println(names[0][0] + " and " + [0][1]);
        System.out.println(names[1][0] + " and " + [1][1]);
    }
}

Chúng ta truy xuất các phần tử cũng thông qua các cặp dấu ngoặc vuông [] và chỉ số tương ứng.

C++ and Java
Python and Ruby

Mảng là một đối tượng và có thuộc tính length lưu trữ số lượng các phần tử để chúng ta có thể sử dụng:

class ArrayLength {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4};
        System.out.println("Array length: " + array.length);
    }
}
4

Sao chép mảng

Lớp System có một phương thức tên là arraycopy() cho phép chúng ta sao chép một mảng sang một mảng khác một cách dễ dàng:

public static void arraycopy(Object src, int srcPos, Object dest, int desPos, int length)

Tham số đầu tiên là mảng nguồn, tham số thứ 2 là vị trí của phần tử đầu tiên được sao chép, tham số thứ 3 là mảng đích, tham số thứ 4 là phần tử đầu tiên trong mảng đích được sao chép, tham số thứ 5 là số lượng các phần tử được sao chép. Ví dụ:

class CopyArrray {
    public static void main(String[] args) {
        char[] from = { 
            'd', 'e', 'c', 'a', 'f', 'f', 
            'e', 'i', 'n', 'a', 't', 'e', 'd'
        };
        char[] to = new char[7];

        System.arraycopy(from, 2, to, 0, 7);
        System.out.println(new String(to));
    }
}
caffein

Một số thao tác trên mảng

Mảng là một kiểu dữ liệu quan trọng, do đó trong Java có một lớp có tên là java.util.Arrays chứa rất nhiều phương thức giúp chúng ta thực hiện các thao tác thường dùng trên mảng một cách dễ dàng.

Số lượng phương thức trong phiên bản Java 8 rất lớn, ở đây chỉ ví dụ một số phương thức:

class ArrayMani {
    public static void main(String[] args) {
        int[] binSearch = {
            1, 3, 15, 29, 40,
            83, 105, 189, 314
        }; 
        int found40 = java.util.Arrays.binarySearch(binSearch, 40);
        System.out.println("40 appears at index " + found40);
 
        char[] arr1 = { 'p', 'h', 'o' };
        char[] arr2 = { 'p', 'h', 'i' };
        boolean same = java.util.Arrays.equals(arr1, arr2);
        if(same == true)
            System.out.println("arr1 and arr2 are the same");
        else 
            System.out.println("arr1 and arr2 are different"); 
 
        int[] intArray = new int[2];
        java.util.Arrays.fill(intArray, 2017);
        System.out.println(intArray[0]);
        System.out.println(intArray[1]);
 
        int[] forSort = { 19, 2, 5, 80, -36 };
        java.util.Arrays.parallelSort(forSort);
        System.out.println(forSort[0]);
        System.out.println(forSort[1]);
        System.out.println(forSort[2]);
        System.out.println(forSort[3]);
        System.out.println(forSort[4]);
   }
}

Trong đoạn code trên chúng ta sử dụng 4 phương thức trong lớp java.util.Arrays là:

  • binarySearch(): phương thức này nhận vào một mảng số đã được sắp xếp theo thứ tự từ bé đến lớn, và một giá trị, phương thức này sẽ trả về vị trí của giá trị đó trong mảng nếu có bằng thuật toán tìm kiếm nhị phân (Binary Search)
  • equals(): phương thức này nhận vào 2 mảng và kiểm tra xem 2 mảng này có giống nhau không, nếu giống thì trả về true, khác thì false.
  • fill(): phương thức này nhận vào một mảng, một giá trị và sẽ gán toàn bộ phần tử trong mảng có giá trị đó
  • parallelSort(): phương thức này sẽ nhận vào một mảng và sắp xếp mảng đó theo thuật toán sắp xếp song song (Parallel Sort), đây là phương thức mới của phiên bản Java 8.
40 appears at index 4
arr1 and arr2 are different
2017
2017
-36
2
5
19
80