Chào mọi người ạ, mọi người cho em hỏi có cách nào để loại bỏ các phần tử trùng lặp trong quá trình sắp xếp một mảng số nguyên theo thứ tự tăng dần không ạ? Em sử dụng Bubble Sort, và dưới đây là code phần removeDuplicates() em đã viết ạ:
/*
Sắp xếp một array intergers + loại bỏ các phần tử trùng lặp khỏi mảng
{5, 2, 7, 2, 8, 5, 3}
*/
static void removeDuplicates(int[] arr){
int n = arr.length;
int [] newArr = new int[n]; // Tạo một mảng mới có cùng kích thước với arr
newArr[0] = arr[0]; // Sao chép phần tử đầu tiên từ arr sang newArr
int newSize = 1;
/*
* Kiếm tra xem arr[i] có giống với một trong những phần tử đã được sao chép vào newArr[] hay không
*/
for(int i = 1; i < n; ++i){
boolean isDuplicate = false;
for (int j = 0; j < newSize; j++){
if(arr[i] == newArr[j]){
isDuplicate = true;
break;
}
}
}
if(!isDuplicate){
newArr[newSize] = arr[i];
newSize++;
}
/*
* Tạo một mảng mới 'trimmedArr' có kích thước 'newSize' => Sao chép các phần tử từ mảng 'newArr' vào mảng mới này
* Vòng lặp for duyệt qua các phần tử của 'newArr' tới chỉ mục 'newSize - 1' => Sao chép vào 'trimmedArr' ở vị trí tương ứng
*/
int[] trimmedArr = new int[newSize];
for (int i = 0; i < newSize; ++i){
trimmedArr[i] = newArr[i];
}
for (int a = 0; a< newSize; ++a){
arr[a] = trimmedArr[a];
}
}
Sau đó em tạo phương thức bubbleSort() để sắp xếp mảng và cuối cùng là trình chiếu mảng bằng printArray().
Đây là cách mà em đã thử sử dụng nhưng vẫn không loại bỏ được các phần tử trùng lặp ạ:
- HashSet
HashSet<Integer> set = new HashSet<>(); int newSize = 0; for(int num: arr){ if(!set.contains(num)){ set.add(num); arr[newSize++] = num; } }
Mọi người cho em xin ý kiến ạ! Em cảm ơn ạ!