您的位置:首页 > 其它

集合Set

2016-02-28 20:15 218 查看
  同样是收集对象,在收集过程中有相同的对象,则不再收集,如果有这样的需求,那么可以使用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>

  再次执行的时候显示,消除了相同的对象。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: