集合Set

  同樣是收集對象,在收集過程中有相同的對象,則不再收集,如果有這樣的需求,那麼可以使用set的接口操作對象。

  例如:有一個字符串,當中有很多英文單詞,你想知道不重複的單詞有幾個;

<span style="font-size:18px;"> public class Words{
	public static void main (string args[]){
	Scanner scanner =new Scanner();
	System.out.print(“請輸入英文:”);
	String line=scanner.nextLine();
	String[] tokens=line.split(“ “);
	Set words=new HashSet();
	for(String token :tokens){
	words.add(token);
}

System.out.print(“不重複單詞有 %d 個:%s%n”,words.size(),words);

}
}
</span>

  顯示結果:


  當set收集的是自定義的實體對象的時候,卻不能排除相同的數據。例如:

<span style="font-size:18px;">class Student{
	private String name;
	private String number;

	Student(String name,String number){
	this.name=name;
	this.number=number;
}



public  class Students{
	public static void main (String[] args){
	Set set=new HashSet();
	set.add(new Student(“Justin”,”B835031”));
	set.add(new Student(“Monica”,”B825032”));
	set.add(new Student(“Justin”,”B835031”));
	
	System.out.print(set);	
}
}
</span>

  結果顯示:並沒有去掉重複的對象。


 

  原因是因爲HashSet會使用對象的hashCode()與equals()來判斷對象是否相同,每個對象的hashCode()取得的值不一樣,纔會導致沒有去掉重複的值。

  那麼我們需要做的是,重寫hashCode()方法,讓name和number一樣的Student認爲是相同的。在Student類中寫:

<span style="font-size:18px;">@Override
public  int hashCode(){
	int hash=5;
	hash=13*hash+(this.name!=null?this.name.hashCode():0);
	hash=13*hash+(this.number!=null?this.number.hashCode():0);
	return hash;

}
</span>

  再次執行的時候顯示,消除了相同的對象。







發佈了121 篇原創文章 · 獲贊 10 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章