集合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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章