自定義對象去重(Set篇)

當需要給集合去重時,實現的方式有很多。這裏介紹使用Set去重(兩種方式)

需求:給多個Student對象去重

public class Student {
	private int id;
	private String name;
	public Student() {}
	public Student(int id,String name) {
		this.id=id;
		this.name=name;
	}
}

方式一:

public static void main(String[] args) {
		Comparator<Student> com=new Comparator<Student>() {
                    @Override
                    public int compare(Student o1, Student o2) {
                    return o1.getId().compareTo(o2.getId());//自定義條件,我這裏只是判斷id相等即爲同一個對象
                    }
                };
                Set<Student> set = new TreeSet<Student>(com);
                set.add(new Student(1, "張三"));
		set.add(new Student(1, "李四"));
		set.add(new Student(1, "張三1"));
		System.out.println(set.size());
        
}

這裏我我只是判斷id相等幾位同一對象,所以即便name不同Set也會判斷三個對象相等。即只保存了一個對象

運行結果:

說明:compareTo ()方法->返回0即爲兩個對象相等

方式二:

拓展:HashSet底層時HashMap,當我滿打開源碼會發現當new一個HashSet時會默認new一個HashMap

我們一般使用HashMap時是這樣使用:

HashMap hashmap=new HashMap<String,Object>();

key是唯一的,String重寫了hashCode和equals方法,所以我們可以非常愉快的使用String對象作爲key來使用

因爲Set存儲的是不重複的對象,依據hashCode和equals進行判斷,所以可以重寫這兩個方法自定義Set的唯一策略

進入正題:

public class Student {
	private Integer id;
	private String name;
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Student() {}
	public Student(int id,String name) {
		this.id=id;
		this.name=name;
	}
	@Override 
	public int hashCode() {
		// TODO Auto-generated method stub
		//return name.hashCode();
		return id;//如果沒有對象的唯一值,可使用 return  name.hashCode()
	}
	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		Student stu=(Student) obj;
		return this.id==stu.id;
	}
}

關於hashCode()說明:由於設定id是對象的唯一標識,所以只是返回id即可,當情況不同是可使用 name.hashCode();規則可靈活改動

運行結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章