Xóa dữ liệu trong arraylist

public static void RemoveStudent(ArrayList<InforStudent> ifst) {
    Scanner s = new Scanner(System.in);
    System.out.println("nhập mã sv muốn xóa: ");
    String keyWordsRemove = s.nextLine();
    for (int i = 0; i < ifst.size(); i++) {
        if (ifst.get(i).getMaSV().equals(keyWordsRemove)) {
            ifst.remove(ifst.get(i).getTen());
            ifst.remove(ifst.get(i).getMaSV());
            ifst.remove(ifst.get(i).getHoTenDem());
            ifst.remove(ifst.get(i).getGioiTinh());
            ifst.remove(ifst.get(i).getNgaySinh());
            System.out.println("Đã xóa: " + keyWordsRemove);
        }else System.out.println("Không tìm thấy dữ liệu cần xóa");
    }
}

InforStudent.java

import java.io.Serializable;

public class InforStudent implements Serializable {
    String maSV;
    String hoTenDem;
    String ten;
    String ngaySinh;
    String gioiTinh;

    public String getMaSV() {
        return maSV;
    }

    public void setMaSV(String maSV) {
        this.maSV = maSV;
    }

    public String getHoTenDem() {
        return hoTenDem;
    }

    public void setHoTenDem(String hoTenDem) {
        this.hoTenDem = hoTenDem;
    }

    public String getTen() {
        return ten;
    }

    public void setTen(String ten) {
        this.ten = ten;
    }

    public String getNgaySinh() {
        return ngaySinh;
    }

    public void setNgaySinh(String ngaySinh) {
        this.ngaySinh = ngaySinh;
    }

    public String getGioiTinh() {
        return gioiTinh;
    }

    public void setGioiTinh(String gioiTinh) {
        this.gioiTinh = gioiTinh;
    }

    public InforStudent() {
    }

    public InforStudent(String maSV, String hoTenDem, String ten, String ngaySinh, String gioiTinh) {
        this.maSV = maSV;
        this.hoTenDem = hoTenDem;
        this.ten = ten;
        this.ngaySinh = ngaySinh;
        this.gioiTinh = gioiTinh;
    }
}

em muốn xóa dữ liệu trong Arraylist mà sao không xóa được ai đó giúp em với.

Cái bạn cần xóa là InforStudent chứ không phải thuộc tính của nó. Bạn đi xa quá rồi, chỉ cần 1 dòng là xong.

ifst.remove(ifst.get(i));

Gọn nữa:

ifst.remove(i);

:man_facepalming::woman_facepalming:

Lưu ý: vòng lặp + xóa phần tử gây ra nhiều vấn đề không biết trước. Hãy cẩn thận!

5 Likes

Xóa vẫn không được anh ơi @SITUVN.gcd

Chắc nó chỉ xóa trong đây thôi :smiley:

@yuh: Trong Java, mọi dữ liệu kiểu đối tượng đều là tham chiếu.
@Vu_Noi: Sao bạn biết nó chưa xóa?

3 Likes

Như @SITUVN.gcd có đề cập, cậu sai tương đối nhiều đấy. Tớ khuyên cậu nên đọc kỹ javadoc của List#remove(Object) để biết câu lệnh này sai gì:

ifst.remove(ifst.get(i).getTen());

Đây là hướng dẫn sử dụng từ Javadoc của method trên:

Removes the first occurrence of the specified element from this list, if it is present (optional operation). If this list does not contain the element, it is unchanged. More formally, removes the element with the lowest index i such that (o==null ? get(i)==null : o.equals(get(i))) (if such an element exists). Returns true if this list contained the specified element (or equivalently, if this list changed as a result of the call).

Ngoài ra, do cậu không implement equals method trong InforStudent, tớ không recommend cậu dùng method này để remove phần tử :sweat_smile:

Mặt khác, List có một method remove khác là List#remove(int), khi cậu chỉ cần truyền index để remove. Cậu đã có biến i để xác định vị trí cần duyệt, nên chỉ cần thế này là xong:

ifst.remove(i);

Tuy nhiên, dù cậu có sửa lại như trên, cậu vẫn sẽ không xóa được phần tử thứ i đâu. Cậu sẽ gặp lỗi lớn khi xóa phần tử của 1 list khi đang duyệt list đó theo index.
Thử tưởng tượng nếu cậu xóa phần tử thứ 2 của list, phần tử thứ 3 sẽ trở thành phần tử thứ 2 mới. Khi cậu duyệt phần tử thứ 3 ở list, thực chất cậu đã skip phần tử thứ 3 cũ, và đang xử lý phần tử thứ 4.
Có nhiều cách xử lý vấn đề này, cơ mà cách tốt nhất khi cậu muốn xóa phần tử của list là dùng iterator. Trông nó sẽ giống như thế này:

Iterator iter = Collection.iterator();
while (iter.hasNext()) {
    Object o = iter.next()
    if (o.equals("what i'm looking for")) {
        iter.remove();
    }
}

Hoặc đơn giản hơn, cậu có thể duyệt từ cuối lên.

Hope it helps!

P/s:

for (int i = 0; i < ifst.size(); i++) {
  if (ifst.get(i).getMaSV().equals(keyWordsRemove)) {
      // remove something
  }else System.out.println("Không tìm thấy dữ liệu cần xóa");
}

Implement trên đơn giản là sai rồi cậu. Cậu sẽ nhận được 1 loạt dòng “Không tìm thấy dữ liệu cần xóa”.

P/s 2: Cậu nên đưa ra rõ vấn đề của cậu. Khi cậu nói:

Cậu nên đưa ra bằng chứng cho câu nói đó. Trong TH này, 1 screenshot đơn giản + source code sau khi sửa sẽ chứng minh được câu nói của cậu.
Nếu không, sẽ rất mất thời gian của tất cả mọi người.

P/s 3: Cậu nên đọc kỹ Javadoc trước khi sử dụng bất cứ method nào. Điều đó sẽ giúp cậu tránh được cơ số vấn đề nhỏ nhặt đó (bằng cách nào đó, đoạn code của cậu đưa cho bọn tớ sai rất nhiều, và phần lớn trong số đó nên được giải quyết dễ dàng bằng việc đọc Javadoc).

4 Likes
for (int i = 0; i < ifst.size(); i++) {
            if (ifst.get(i).getMaSV().equals(keyWordsRemove)) {
                ifst.remove(i);
//              ifst.remove(ifst.get(i).getTen());
//              ifst.remove(ifst.get(i).getMaSV());
//              ifst.remove(ifst.get(i).getHoTenDem());
//              ifst.remove(ifst.get(i).getGioiTinh());
//              ifst.remove(ifst.get(i).getNgaySinh());
                System.out.println("Đã xóa: " + keyWordsRemove);
            }else System.out.println("Không tìm thấy dữ liệu cần xóa");
        }

Và mình nghĩ bạn cũng nên coi lại cách sử dụng của for(), nếu bạn làm như cách trên thì cứ mỗi vòng for nó sẽ println ra 1 trong 2 dòng "Đã xóa: " + keyWordsRemove hoặc "Không tìm thấy dữ liệu cần xóa". Mọi người đưa cho bạn hướng giải quyết rồi, còn giải quyết như thế nào thì bạn nên tự tìm hiểu thêm.

2 Likes

Sau 5 năm không động gì đến Android/Java chắc quên hết cơ bản luôn rồi :laughing:

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