Xóa phần tử trùng nhau trong mảng Java | Laptrinhcanban.com

Xóa phần tử trùng nhau trong mảng Java

Hướng dẫn cách xoá phần tử trùng trong mảng Java. Bạn sẽ học được 2 cách căn bản để xoá phần tử trùng trong mảng Java sau bài học này.

Chúng ta có 2 cách xóa phần tử trùng trong mảng Java như sau:

  • Xóa phần tử trùng trong mảng Java bằng LinkedHashSet
  • Xóa phần tử trùng trong mảng Java bằng cách dịch chuyển nội bộ trong mảng

Có thể xóa phần tử trùng nhau trong mảng trong Java?

Giả sử chúng ta có mảng chứa các phần tử trùng nhau như sau:

int[] arr= {1, 2, 3, 1, 3, 2, 4};

Ở mảng này, các phần tử là 1, 2 và 3 là phần tử trùng nhau, và sau khi xoá phần tử trùng nhau, mảng kết quả sẽ là {1,2,3,4}.

Tuy nhiên khác với các ngôn ngữ lập trình khác thì mảng trong Java có kích thước cố định được quyết định khi khai báo mảng, và chúng ta không thể thay đổi kích thước của mảng sau khi khai báo.

Bởi vậy, chúng ta không thể xóa phần tử trong mảng Java, sau khi đã tạo nó. Điều chúng ta có thể làm, đó là dịch chuyển nội bộ các phần tử không trùng nhau về một phía của mảng và chỉ sử dụng các phần tử này, hoặc là chuyển mảng về một kiểu dữ liệu khác dễ xử lý xoá phần tử trùng nhau hơn mà thôi.

Xóa phần tử trùng trong mảng Java bằng LinkedHashSet

Cách đơn giản và dễ nhất để xóa phần tử trùng trong mảng Java đó chính là chuyển nó về một kiểu dữ liệu khác dễ xử lý xoá phần tử trùng nhau hơn, rồi sau đó mới chuyển lại kết quả về kiểu mảng.

Và kiểu dữ liệu tiều biểu ở đây chính là kiểu LinkedHashSet trong Java. Đây là kiểu dữ liệu chỉ cho phép chứa các phần tử duy nhất trong nó, do đó trong quá trình chuyển từ mảng sang LinkedHashSet thì các phần tử trùng nhau sẽ được tự động xoá đi và chỉ để lại các phần tử duy nhất mà thôi.

Cách xóa phần tử trùng trong mảng Java bằng LinkedHashSet như sau:

import java.util.*;  
public class Main{

/*Tạo phương thức xoá phần tử trùng trong mảng Java*/
public static void remove_Duplicate_Elements(Integer arr[], int n){
// Chuyển mảng đã cho thành LinkedHashSet và xoá các phần tử trùng nhau
LinkedHashSet<Integer> hashSet = new LinkedHashSet<>(Arrays.asList(arr));

// Chuyển LinkedHashSet lại trở về mảng
arr = hashSet.toArray(new Integer[0]);
// In mảng kết quả
System.out.println(Arrays.toString(arr));
}

public static void main (String[] args) {
Integer arr1[] = { 7, 2, 6, 7, 4, 9, 8 };
Integer arr2[] = { 7, 2, 6, 7, 7 };
Integer arr3[] = { 7, 7, 7 };


//Xoá phần tử trùng nhau trong các mảng
remove_Duplicate_Elements(arr1, arr1.length);
remove_Duplicate_Elements(arr2, arr2.length);
remove_Duplicate_Elements(arr3, arr3.length);

}
}

Kết quả chương trình xóa phần tử trùng trong mảng Java:

[7, 2, 6, 4, 9, 8]
[7, 2, 6]
[7]

Xóa phần tử trùng trong mảng Java bằng cách dịch chuyển nội bộ trong mảng

Trong trường hợp bạn chỉ muốn xử lý với mảng khi xóa phần tử trùng nhau, hãy sử dụng tới cách dịch chuyển phần tử nội bộ trong mảng dưới đây.

Trước hết, chúng ta cần phải sắp xếp mảng đã cho đã. Để sắp xếp mảng, chúng ta sẽ sử dụng tới phương thức Arrays.sort mà Kiyoshi đã hướng dẫn trong bài:

Ý tưởng ở đây là, sau khi sắp xếp mảng, thì các phần tử trùng nhau (nếu có) sẽ được xếp nằm cạnh nhau, do đó chúng ta chỉ cần kiểm tra 2 phần tử trùng nhau xem chúng có bằng nhau hay không là có thể xác định được các phần tử trùng nhau trong mảng.

Khi tìm thấy các phần tử trùng nhau rồi, chúng ta sẽ lần lượt chuyển chúng về phía đầu mảng bằng cách ghi đè giá trị lên các phần tử ở đầu mảng. Và sau đó chỉ cần lấy toàn bộ các phần tử không còn trùng nhau đã được dịch chuyển về đầu mảng là chúng ta có thể hoàn thành việc xóa phần tử trùng trong mảng Java rồi.

Chúng ta viết hàm xóa phần tử trùng trong mảng Java trong chương trình bằng cách dịch chuyển nội bộ như sau:

import java.util.Arrays;  
public class Main{

/*Tạo phương thức xoá phần tử trùng trong mảng Java*/
public static int remove_Duplicate_Elements(int arr[], int n){
if (n==0 || n==1){ //Nếu mảng chỉ có 0 hoặc 1 phần tử thì thoát
return n;
}
int end = 0;

for (int i = 1; i < n; ++i) {
if (arr[i] != arr[end]) { //Tìm thấy phần tử trùng nhau
++end; //Tăng dần vị trí đầu mảng để gán phần tử trùng nhau
arr[end] = arr[i]; //Ghi đè phần tử trùng nhau vào vị trí đầu mảng
}
}

return end + 1;

}

/*Tạo phương thức in số lượng phần tử chỉ định từ mảng*/
public static void show_array(int arr[], int n){
for (int i=0; i<n; i++) System.out.print(arr[i]+" ");
System.out.print("\n");

}


public static void main (String[] args) {
int arr1[] = { 7, 2, 6, 7, 4, 9, 8 };
int arr2[] = { 7, 2, 6, 7, 7 };
int arr3[] = { 7, 7, 7 };

// Sắp xếp các mảng theo thứ tự tăng dần
Arrays.sort(arr1);
Arrays.sort(arr2);
Arrays.sort(arr3);

//Xoá phần tử trùng nhau trong các mảng
int size1 = remove_Duplicate_Elements(arr1, arr1.length);
int size2 = remove_Duplicate_Elements(arr2, arr2.length);
int size3 = remove_Duplicate_Elements(arr3, arr3.length);

//In các phần tử không trùng nhau đã được chuyển lên đầu mảng
show_array(arr1, size1);
show_array(arr2, size2);
show_array(arr3, size3);
}
}

Kết quả chương trình xóa phần tử trùng trong mảng Java:

2 4 6 7 8 9 
2 6 7
7

Ở phần trên chúng ta đã di chuyển các phần tử không trùng nhau lên đầu mảng ban đầu. Nếu bạn muốn lấy riêng các phần tử trùng nhau ra, hãy viết thêm xử lý lấy các phần tử này và gán vào một mảng mới nhé.

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn cách xoá phần tử trùng trong mảng Java rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về Java trong các bài học tiếp theo.

Hãy chia sẻ và cùng lan tỏa kiến thức lập trình Nhật Bản tại Việt Nam!

HOME>> >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.