[JAVA] Mảng và lớp công cụ java.util.Arrays – Phần 2
Ở phần trước mình đã nói về một số đặc điểm cơ bản của java nên trong phần này mình sẽ đi luôn vào lớp công cụ java.util.Arrays trong java các phương thức (method) đầy hữu ích và mạnh mẽ của nó.
Lớp công cụ java.util.Arrays là gì?
java.util.Arrays là một lớp đặc biệt trong java, nó bao gồm rất nhiều phương thức (method) dạng static chuyên dụng cho việc thao tác trên mảng như là tìm kiếm và sắp xếp, ngoài ra nó còn bao gồm phương thức cho phép chuyển mảng thành dạng danh sách (list).
Để biết thêm chi tiết các bạn có thể truy cập vào trang javadoc của lớp công cụ tại địa chỉ sau: https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html
Các phương thức (method) chính trong lớp công cụ java.util.Arrays và cách sử dụng
Không dài dòng về phần giới thiệu nữa, mình sẽ đi ngay vào các phương thức chính đáng quan tâm của lớp công cụ java.util.Arrays này (thứ tự các phương thức được đưa ra theo mức độ thường xuyên sử dụng của mình):
1. Phương thức asList()
Chức năng: Phương thức asList() cho phép chuyển mảng thành danh sách (list) có cùng kiểu dữ liệu.
Cú pháp: List<Kiểu_dữ_liệu> tên_list = Arrays.asList(<Tên_mảng>)
Ví dụ:
Giả sử ta có mảng bao gồm 10 phần tử kiểu String như sau:
String[] arrStr = new String[10];
Ta thực hiện chuyển mảng này sang kiểu danh sách (list) như sau:
List<String> listStr = Arrays.asList(arrStr);
2. Phương thức sort()
Chức năng: Phương thức sort() giúp sắp xếp các phần tử của mảng mặc định theo thứ tự tăng dần dựa trên thuật toán quick sort.
Cú pháp: Arrays.sort(<Tên_mảng>)
hoặc: Arrays.sort(<Tên_mảng>, start_index, stop_index)
hoặc: Arrays.sort(<Tên_mảng>, Comparator)
hoặc: Arrays.sort(<Tên_mảng>, start_index, stop_index, Comparator)
Ví dụ:
Giả sử ta có mảng arrInt như sau:
int[] arrInt = {2, 8, -1, 0, 10, 16, 9, 4, 2, -6};
sau khi sử dụng phương thức sort:
Arrays.sort(arrInt);
Ta sẽ được mảng sau:
-6, -1, 0, 2, 2, 4, 8, 9, 10, 16
Ta cũng có thể sắp xếp các phần tử nằm trong một khảng bất kì trong mảng như sau:
Arrays.sort(arrInt, 2, 8); //sắp xếp từ vị trí thứ 3 (index 2) đến vị trí thứ 8 (index 7)
ta sẽ có được kết quả như sau:
2, 8, -1, 0, 4, 9, 10, 16, 2, -6
Chú ý: Khi sử dụng phương thức sort cần chú ý một số điểm sau
- Đối với các kiểu dữ liệu nguyên thủy kiểu số như int, long, float, … hoặc với String các bạn có thể sử dụng trực tiếp phương thức sort() mà không cần implement gì thêm.
- Đối với các kiểu dữ liệu tự định nghĩa để sử dụng được phương thức sort(), các bạn cần thực thi (implements) thêm giao diện (interface) Comparable, cụ thể hơn là ghi đè (override) phương thức compareTo() của interface Comparable
- Khi sắp xếp các phần tử trong một mảng con của mảng thì khi gọi sort(arr, fromIndex, toIndex) thì sẽ chỉ có các phần tử từ fromIndex đến toIndex-1 được sắp xếp (chứ phần tử ở toIndex không được sắp xếp).
- Phương thức sort() còn cho bạn tùy biến cách so sánh các phần tử trong mảng để đưa ra kết quả sắp xếp tương ứng bằng cách sử dụng Comparator mà mình sẽ đề cập đến trong bài viết khác.
3. Phương thức binarySearch()
Chức năng: Phương thức binarySearch() giúp tìm kiếm phần tử có giá trị xác định trong mảng đã sắp xếp dựa trên thuật toán binary search nổi tiếng
Return: Trả lại chỉ mục (index) của phần từ đầu tiên bên trái có giá trị cần tìm hoặc trả lại -1 nếu trong mảng không có phần tử cần tìm.
Cú pháp: Arrays.binarySearch(<Tên_mảng>, giá_trị_cần_tìm)
hoặc: Arrays.binarySearch(<Tên_mảng>, start_index, stop_index, giá_trị_cần_tìm)
hoặc: Arrays.binarySearch(<Tên_mảng>, Comparator, giá_trị_cần_tìm)
hoặc: Arrays.binarySearch(<Tên_mảng>, start_index, stop_index, Comparator, giá_trị_cần_tìm)
Ví dụ:
Giả sử ta có mảng arrInt đã được sắp xếp ở trên:
int[] arrInt = {-6, -1, 0, 2, 2, 4, 8, 9, 10, 16};
Ta thực hiện tìm phần tử có giá trị 4 như sau:
1 |
int index = Arrays.binarySearch(arrInt, 4); |
Và kết quả sẽ là:
index = 5 //phần từ thứ 6 trong mảng
Ta cũng có thể tìm kiếm phần tử nằm trong một khảng bất kì trong mảng như sau:
int index = Arrays.binarySearch(arrInt, 2, 8, 4); //tìm kiếm phần tử có giá trị 4 từ vị trí thứ 3 (index 2) đến vị trí thứ 8 (index 7)
ta sẽ có được kết quả như sau:
index = 5
Chú ý: Tương tự như khi sử dụng phương thức sort(), khi sử dụng phương thức binarySearch() ta cũng cần chú ý các điểm sau:
- Để sử dụng binarySearch() mảng bắt buộc phải được sắp xếp từ trước, nếu không sẽ gây ra lỗi và không thể tìm kiếm được.
- Đối với các kiểu dữ liệu nguyên thủy kiểu số như int, long, float, … hoặc với String các bạn có thể sử dụng trực tiếp phương thức binary() mà không cần implement gì thêm.
- Để sử dụng phương thức binarySearch() thì mảng phải được sắp xếp và các phần tử trong mảng cũng phải ghi đè phương thức compareTo() của interface Comparable.
- Khi tìm kiếm phần tử trong một mảng con của mảng thì khi gọi binary(arr, fromIndex, toIndex, key) thì sẽ chỉ có các phần tử từ fromIndex đến toIndex-1 được tìm kiếm (chứ phần tử ở toIndex không được tính vào).
- Phương thức binarySearch() còn cho bạn tùy biến cách so sánh các phần tử trong mảng để đưa ra kết quả sắp xếp tương ứng bằng cách sử dụng Comparator mà mình sẽ đề cập đến trong bài viết khác.
4. Phương thức copyOfRange()
Chức năng: Phương thức copyOfRange() cho phép tạo mảng mới là một mảng con của mảng đã cho.
Cú pháp: Arrays.copyOfRange(<Tên_mảng>, start_index, stop_index)
Ví dụ:
Giả sử ta có mảng arrInt như sau:
int[] arrInt = {2, 8, -1, 0, 10, 16, 9, 4, 2, -6};
Ta thực hiện copy mảng từ index thứ 2 đến thứ 7 như sau:
1 |
int[] arrCopy = Arrays.copyOfRange(arrInt, 2, 8); |
Và kết quả là ta được mảng arrCopy như sau:
-1, 0, 10, 16, 9, 4
5. Phương thức copyOf()
Chức năng: Phương thức copyOf() cho phép tạo mảng mới có kích thước chỉ định và bao gồm các phần tử của mảng đã cho.
Cú pháp: Arrays.copyOf(<Tên_mảng>, kích_thước_mới)
Ví dụ:
Giả sử ta có mảng arrInt như sau:
int[] arrInt = {2, 8, -1, 0, 10, 16, 9, 4, 2, -6};
Ta thực hiện copy ra mảng mới có kích thước 15 như sau:
int[] arrCopy = Arrays.copyOf(arrInt, 15);
Và kết quả thu được là mảng arrCopy như sau:
2, 8, -1, 0, 10, 16, 9, 4, 2, -6, 0, 0, 0, 0, 0
Hoặc ta có thể copy ra mảng mới với kích thước là 8 như sau:
int[] arrCopy = Arrays.copyOf(arrInt, 8);
Kết quả thu được là:
2, 8, -1, 0, 10, 16, 9, 4
Chú ý:
- Khi mảng mới có kích thước lớn hơn mảng đã có thì các phần tử ở cuối mảng tính từ vị trí là kích thước mảng cũ sẽ có giá trị mặc định của kiểu của mảng: với kiểu boolean là false, kiểu số là 0, các kiểu tham chiếu là null.
- Khi mảng mới có kích thước nhỏ hơn mảng đã có thì các chỉ các phần từ tính từ vị trí 0 đến kích thước mảng mới -1 sẽ được copy sang mảng mới.
6. Phương thức fill()
Chức năng: Phương thức fill() cho lấp đầy tất cả các phần tử trong mảng với 1 giá trị xác định.
Cú pháp: Arrays.fill(<Tên_mảng>, giá_trị)
hoặc: Arrays.fill(<Tên_mảng>, start_index, stop_index, giá_trị)
Ví dụ:
Giả sử ta có mảng arrInt với kiểu nguyên, kích thước 10 như sau:
int[] arrInt = new int[10];
Ta sẽ lấp đầy mảng arrInt với giá trị 1 như sau:
Arrays.fill(arrInt, 1);
Ta sẽ thu được mảng arrInt với tất cả các phần tử là 1:
1, 1, 1, 1, 1, 1, 1, 1, 1, 1
Hoặc ta có thể chỉ lấp đầy từ index thứ 3 đến thứ 7 với giá trị là 1 bằng cách sau:
Arrays.fill(arrInt, 2, 8, 1);
Ta sẽ có mảng arrInt như sau:
0, 0, 1, 1, 1, 1, 1, 1, 0, 0
7. Phương thức equals()
Chức năng: Phương thức equals() thực hiện việc so sánh 2 mảng có bằng nhau hay không.
Return: Kết quả là true nếu 2 mảng có kích thước và các phần tử của 2 mản ở các vị trí giống nhau là bằng nhau và false trong các trường hợp còn lại.
Cú pháp: Arrays.equals(<Tên_mảng_1>, <Tên_mảng_2>)
Ví dụ:
Giả sử ta có 3 mảng arrInt1, arrInt2 và arrInt3 như sau:
1 2 3 |
int[] arrInt1 = {2, 8, -1, 0, 10, 16, 9, 4, 2, -6}; int[] arrInt2 = {2, 8, -1, 0, 10, 16, 9, 4, 2, -6}; int[] arrInt3 = {2, 9, -1, 2, 10, 11, 9, 4, 7, -6}; |
Ta thực hiện so sánh mảng arrInt1 với arrInt2 và so sánh arrInt1 với arrInt3 như sau:
1 2 3 |
Arrays.equals(arrInt1, arrInt2); //kết quả là true Arrays.equals(arrInt1, arrInt3); //kết quả là false |
Vâng như vậy là mình đã giới thiệu tới các bạn các phương thức chính và các chú ý khi sử dụng lớp công cụ java.util.Arrays rồi. Hi vọng sau khi xem xong bài viết này các bạn sẽ nắm rõ hơn cách tương tác với mảng, và hiểu được cách làm việc với mảng sao cho thuận tiện nhất.
Xin cảm ơn các bạn đã đọc bài viết của mình.
Twitter tags: #java-co-ban, #java-cho-nguoi-da-biet, #java-util, #that2u
- Google+
- Wordpress