Hỏi về mảng 1 chiều trong Java

Mình đã Code ở đây

package Main;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //Khai báo sô phần tử
        int n;
        //Nhạp vào số lượng phần tử từ 100 đến 300
        do {
            System.out.println("Nhap vao so luong phan tu: ");
            n = sc.nextInt();
        } while (n < 100 || n > 300);
        //Khai báo mảng 1 chiều gồm n phần tử
        int[] a = new int[n];
        //Tạo mảng với các số ngẫu nhiên. Nên nhập n càng lớn thì càng có nhiều số trùng lặp
        System.out.println("Mang tao ngau nhien");
        for (int i = 0; i < n; i++) {
            a[i] = new Random().nextInt() % 100;
        }
        System.out.println("Da tao xong mang ngau nhien");
        //Hien th mang ngau nhien
        System.out.println("Mang ngau nhien");
        for (int i = 0; i < n; i++) {
            System.out.format("%5d", a[i]);
            if ((i + 1) % 10 == 0) {
                System.out.format("%n");
            }
        }
        System.out.format("%nSo phan tu cua mang la: %5d%n", n);
        //Xoa cac phan tu trung nhau trong mang ngau nhien
        ArrayList<Integer> arr = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            if (!arr.contains(a[i])) {
                arr.add(a[i]);
            }
        }
        n = 0;
        for (int i = 0; i < arr.size(); i++) {
            a[n++] = arr.get(i);
        }
        System.out.println("Mang sau khi xoa cac phan tu trung nhau");
        for (int i = 0; i < n; i++) {
            System.out.format("%5d", a[i]);
            if ((i + 1) % 10 == 0) {
                System.out.format("%n");
            }
        }
        System.out.format("%nSo phan tu cua mang la: %5d%n", n);
    }
}
Và mình cũng biết là Code Xóa các phần tử trùng nhau trong mảng 1 chiều là thế này
int i = 0;
    while (i < n)
    {
        int j = i + 1;
        while (j < n)
            if (a[i] == a[j])
            {
                for (int k = j; k < n; k++)
                    a[k] = a[k + 1];
                n--;
            }
            else j++;
        i++;
    }

Nhưng mà mình không thể nào xóa được các phần tử trùng nhau trong mảng 1 chiều bằng Code đó mà phải chuyển qua ArrayList. (Lỗi vòng lặp nếu dùng hàm còn viết trực tiếp trong main thì lỗi vì quá số lượng mảng tức là sau khi n-- thì nó không thay đổi n nên lỗi vòng lặp chổ k<n ạ) Các Pro cho em hỏi cách xử lý em nó mà ko cần thông qua ArrayList.

Dưới đây là ý tưởng của mình, đầu tiên phải tối ưu dữ liệu đầu vào là một mảng bất kỳ bằng cách sắp xếp lại theo thứ tự, ở đây mình cho một mảng sắp xếp sẵn cho tiện

package duplicated.element.elimination;

/**
 *
 * @author ChiNguyen
 */
public class DuplicatedElementElimination {

    /**
     * @param args the command line arguments
     */
    public static int[] moveArray(int start, int[] arr) {
        int[] arrr = new int[arr.length - 1];
        for (int i = 0; i < arr.length - 1; i++) {
            if(i < start) arrr[i] = arr[i];
            else arrr[i] = arr[i + 1];
        }
        return arrr;
        
    }
    
    public static int [] iliminate(int[] arr) {
        int l = arr.length;
        int check=0;
        int[] a = arr;
        for (int i = 0; i < l-1; i++) {
            if(arr[i+1]>arr[i]) check++;   // Kiễm tra liệu có phần tử trùng nhau không
            else {
                a = moveArray(i, arr); // Nếu bằng thì loại bỏ và dời các phần tử sau lên
                break;
            }
        }
        if (check==l-1) { // Nếu toàn bộ mảng không có element trùng thì check = số lần kiễm tra mảng từ đầu đến cuối
            return a;
        } else return iliminate(a); // chổ này là đệ quy
    }
    public static void main(String[] args) {
        int[] arr = {1, 2, 2, 3, 4, 5, 5, 6, 6, 6, 8, 8};
      
        
        arr = iliminate(arr);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
            
        }
        
    }
    
}

Ý nghĩa của hàm moveArray là loại bỏ một phần tử và dời các phần tử phía sau lên trước để trám vào vị trí đó:

Đợi em tầm 30p nữa e dùng Lap gõ Code nhé. Giờ đang dùng Stupid Phone =)

Cảm ơn vì đã chia sẻ nhưng bác làm từ 1 bài cơ bản đến thành rắc rối.quá
E xin đưa bác cái Code mà e đã mất công 2 ngày để ngâm cứu
Vấn đề

int i = 0;
while (i < n) {
    int j = i + 1;
    while (j < n)
        if (a[i] == a[j]) {
            for (int k = j; k < n; k++)
                a[k] = a[k + 1];
            n--;
        } else j++;
    i++;
}

Mục đích : Dồn các phần tử theo ý tưởng là xóa đi phần tử ở vị trị k trong mảng a có n phần tử
Nguyên nhân: Vòng While bên trong giảm giá trị của n nhưng vòng bên ngoài không nhận. Vì lý do đó nên khi dùng Code này luôn bị ArrayOutOfIndex (gì đó không nhớ nữa). (Ức chế quá cài lại Win mà giờ chưa cài Soft gì ngoài Firefox nên ko nhớ tên lỗi)
Để xóa 1 phần tử trong 1 mảng ta luôn có 2 thuật toán. Thuật toán 1 đã trình bày ở trên và Error nên ta dùng thuật toán số 2. Xóa đi phần tử có giá trị là x trong mảng a có n phần tử

for (int i=0; i<n; i++) {
    int dem=0;
    for (int j=i+1; j<n; j++)
        if (a[j]==a[i])
            dem++;
        else a[j-dem]=a[j];
    n=n-dem;
}

P/s: Bác @Đạt làm ơn sao cho cái thẻ Blockquote đóng đúng vị trí giúp em. E là e chịu á

Tự tìm hiểu đi bạn

Mình nghĩ nếu mục đích chỉ là loại bỏ các phần tử trùng thì thay vì add vào ArrayList, bạn có thể add thẳng vào 1 cái HashSet, tự nó sẽ loại bỏ phần tử trùng cho bạn. Không phải mất công như vậy

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?