01/10/2018, 00:19
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.
Bài liên quan
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
Ý 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 đề
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ử
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