[Support] Lỗi ArrayList<> .contains

giant26

Member
4/11/11
70
2
6
Em có đối tượng Người có các thuộc tính (Tên, tuổi, giới tính)
Khi khai báo:
Code:
     ArrayList<Nguoi> arrNguoi = new ArrayList<Nguoi>();
		Nguoi n1 = new Nguoi();
		n1.setTen("abc");
		n1.setTuoi(22);
		n1.setGioiTinh("male");

		Nguoi n2 = new Nguoi();
		n2.setTen("abc");
		n2.setTuoi(22);
		n2.setGioiTinh("male");

		for(int i = 0 ; i<2; i++){	
			System.out.println("contains = " + arrNguoi.contains(n1));
			//lần 1: false, lần 2 đối tượng n1 đã được gán
                        // bằng n2(có cùng thuộc tính y chang n1)
                        // -> tại sao cũng false, phải là true mới đúng?
			if(!arrNguoi.contains(n1)){
				arrNguoi.add(n1);
                        }
			n1= n2;
		}
Kết quả trong arrNguoi có 2 Nguoi giống nhau.
Em làm với đối tượng Interger thì được, còn với đối tượng Nguoi thì hàm contains bị sai? Mong các anh hướng dẫn :)
 

giant26

Member
4/11/11
70
2
6
Ðề: [Support] Lỗi ArrayList<> .contains

Cảm ơn anh, vậy là em chưa override rồi :)
Code:
public class Nguoi implements Serializable, Comparable<Nguoi>{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String ten;
	private int tuoi;
	private boolean gioiTinh;
	/**
	 * @return the ten
	 */
	public String getTen() {
		return ten;
	}
	/**
	 * @param ten the ten to set
	 */
	public void setTen(String ten) {
		this.ten = ten;
	}
	/**
	 * @return the tuoi
	 */
	public int getTuoi() {
		return tuoi;
	}
	/**
	 * @param tuoi the tuoi to set
	 */
	public void setTuoi(int tuoi) {
		this.tuoi = tuoi;
	}
	/**
	 * @return the gioiTinh
	 */
	public boolean isGioiTinh() {
		return gioiTinh;
	}
	/**
	 * @param gioiTinh the gioiTinh to set
	 */
	public void setGioiTinh(boolean gioiTinh) {
		this.gioiTinh = gioiTinh;
	}
	@Override
	public int compareTo(Nguoi o) {
		// TODO Auto-generated method stub
		return 0;
	}
	
}
Em cứ nghĩ Tết hông còn ai trên diễn đàn :D cảm ơn BQT, chúc BQT ăn Tết vui vẻ và dồi dào sức khỏe :)
 
  • Like
Reactions: mai220111

JackV

Administrator
Staff member
Ðề: [Support] Lỗi ArrayList<> .contains

:D bạn có thể khai báo như thế này
PHP:
public class Nguoi {

    private String ten;
    private int tuoi;
    private boolean gioiTinh;

    public Nguoi(String ten, int tuoi, boolean gioiTinh) {
        this.ten = ten;
        this.tuoi = tuoi;
        this.gioiTinh = gioiTinh;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Nguoi other = (Nguoi) obj;
        if ((this.ten == null) ? (other.ten != null) : !this.ten.equals(other.ten)) {
            return false;
        }
        if (this.tuoi != other.tuoi) {
            return false;
        }
        if (this.gioiTinh != other.gioiTinh) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        return hash;
    }
    
    
}
Mình thường hiện thực cái Comparable<Nguoi> khi sử dụng Collections.sort danh sách các đối tượng theo giá trị của trường nào đó.
 
  • Like
Reactions: mai220111

giant26

Member
4/11/11
70
2
6
Ðề: [Support] Lỗi ArrayList<> .contains

Cảm ơn anh rất nhiều, cái hash = 7 trong hashCode có nghĩa và dùng để dùng trong trường hợp nào vậy anh (nếu chỉ dùng contains thì override equals là đủ)