读书人

set是怎么区分重复数据的

发布时间: 2012-12-21 12:03:49 作者: rapoo

set是如何区分重复数据的
set不能存放重复数据,那么,set是如何区分两个数据是否重复呢?

public class Person{private int id;private String name;public Person(int id, String name) {super();this.id = id;this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}


public class ListRemoveDu {public static void main(String[] args) {List<Person> list=new ArrayList();Set<Person> set=new HashSet();Person p1=new Person(1,"name1");Person p2=new Person(2,"name2");Person p3=new Person(3,"name3");Person p4=new Person(2,"name2");list.add(p1);list.add(p2);list.add(p3);list.add(p4);for (Person p : list) {set.add(p);}for (Person p : set) {System.out.println(p.getName());}}}

实际上两个重复的数据p2和p4都被添加进去了。
HashSet,这个集合类继承于Set接口,爷爷是Collection接口。首先他接受一个参数的泛型,泛型的作用就是在编译期去严格检查输入类型,HashSet添加元素时,需要对这个泛型类的hashCode值进行判断,测试是否为重复元素,如果一样,再测试equals结果。
所以以上的代码得改写成如下
public class Person{private int id;private String name;public boolean equals(Object p){if(((Person)p).getId()==this.getId()){return true;}else{return false;}}public int hashCode(){       return 0;   }public Person(int id, String name) {super();this.id = id;this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

这样就可以实现不添加重复数据了。
set的另一个实现是treeset,treeset是靠实现Comparator接口来对数据进行排序,所以不需要上面的equals方法了。
treeset的实现是
public class Person implements Comparable<Person>{private int id;private String name;public int compareTo(Person person) {if(this.getId()>person.getId()){return -1;}else if(this.getId()==person.getId()){return 0;}else{return 1;}}public Person(int id, String name) {super();this.id = id;this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}public class ListRemoveDu {public static void main(String[] args) {List<Person> list=new ArrayList();Set<Person> set=new TreeSet();Person p1=new Person(1,"name1");Person p2=new Person(2,"name2");Person p3=new Person(3,"name3");Person p4=new Person(2,"name2");list.add(p1);list.add(p2);list.add(p3);list.add(p4);for (Person p : list) {set.add(p);}for (Person p : set) {System.out.println(p.getName());}}}

读书人网 >编程

热点推荐