1. 程式人生 > >java:Set對象TreeSet有序子類,HashSet無序子類,重復對象二

java:Set對象TreeSet有序子類,HashSet無序子類,重復對象二

hash ceo person system boolean 需要 false tostring 兩個

TreeSet有序子類;

HashSet無序子類

重復重復元素,Object對象是通過equals和hashCode來進行過濾的。

如果將上一篇提到中的例子中的TreeSet,換成HashSet,那麽代碼就不會過濾從的對象

HashSet無序子類,如何過濾重復的對象呢?(單個元素是可以過濾,但相同的對象不會)

Person:

public class Person implements Comparable<Person> {

	private String name;
	private int age;	
	
	
	public Person(String name, int age) {		
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public int getAge() {
		return age;
	}
	
	public void setAge(int age) {
		this.age = age;
	}
		
	
	
	@Override
	public String toString() {
		return "姓名:" + name + ", 年齡:" + age + "";
	}

	public int compareTo(Person o) {
		// TODO 自動生成的方法存根
		if(this.age > o.age)
		{
			return 1;
		}else if(this.age < o.age)
		{
			return -1;
		}else{
			//如果age年齡相同需要在判斷name,是否重復
			return this.name.compareTo( o.name );
		}
	}
	
	
}

  

SetDemo3:

Set<Person> allSet = new HashSet<Person>();
		
		allSet.add(new Person("張三",30));
		//重復對象
		allSet.add(new Person("張三",30));
		allSet.add(new Person("李四",30));
		allSet.add(new Person("王五",31));
		allSet.add(new Person("趙六",31));
		allSet.add(new Person("田七",32));
		//重復對象
		allSet.add(new Person("田七",32));
		
		System.out.println(allSet);

輸出結果:

[姓名:王五, 年齡:31, 姓名:田七, 年齡:32, 姓名:田七, 年齡:32, 姓名:張三, 年齡:30, 姓名:張三, 年齡:30, 姓名:李四, 年齡:30, 姓名:趙六, 年齡:31]

這時需要過濾掉重復的對象,那麽Person還需要復寫equels,和HashCode兩個方法,這兩個方法作用了過濾重復的對象:

public int hashCode()
	{
		return this.name.hashCode() * this.age;
	}
		
	public boolean equals(Object o)
	{
		if(this == o)
		{
			return true;
		}
		if( !(o instanceof Person) )
		{
			return false;
		}
		Person p = (Person) o;
		if(this.name.equals(p.name) && this.age == p.age)
		{
			return true;
		}else{
			return false;
		}
		
	}

  

執行的結果:

[姓名:趙六, 年齡:31, 姓名:李四, 年齡:30, 姓名:張三, 年齡:30, 姓名:王五, 年齡:31, 姓名:田七, 年齡:32]

  

java:Set對象TreeSet有序子類,HashSet無序子類,重復對象二