由于昨天学的比较晚,智言我在学习完HashSet后其实已经将TreeSet看了一遍,但是后来由于看完后就去写《java常用对象API中集合框架之HashSet》这篇文章,为了让之后想学java的新朋友能够看的明白HashSet的用法,所以我把HashSet写的非常的详细,同时用了一些案例来配合讲解,所以以至于今天在回忆TreeSet的知识点的时候,完全是处于茫然的局面,而且是一点记忆都没有,所以今天下班后马上就把TreeSet的知识点又重新的看了一遍,直到看明白后我才决定在我的博客里写上关于TreeSet的一些知识点说明,好让其他网友茅塞顿开…
首先还是先来了解一下TreeSet的大致作用:它是可以对Set集合中的元素进行自然排序,并且是不同步的;它判断元素唯一性的方式就是根据比较方法的返回结果是否是0,是0,就是相同元素,那么就不存储。
例如:
这里建立主函数TreeSetDemo类
public class TreeSetDemo{
public static void main(String[] args){
TreeSet ts = new TreeSet();
ts.add(“abc”);
ts.add(“bcd”);
ts.add(“cba”);
ts.add(“bdc”);
ts.add(“aed”);
Iterator it = ts.iterator(); //创建迭代器
while(it.hasNext()){
System.out.println(it.next());
}
}
}
显示结果为:
abc
aed
bcd
bdc
cba
这次的结果符合TreeSet的定义,对Set中的元素进行自然排序。
但是,当我添加进TreeSet类中的元素定义成我自己设计的Person类的时候,这个时候程序开始出现错误,如下:
1.首先建立Person类()
public class Person{
private String name;
private int age;
public Person(String name, int age){
super();
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;
}
}
2.然后将主函数TreeSetDemo类更改为:
public class TreeSetDemo {
public static void main(String[] args) {
TreeSet ts = new TreeSet();
ts.add(new Person(“张三”,21));
ts.add(new Person(“李四”,22));
ts.add(new Person(“王五”,24));
ts.add(new Person(“赵六”,28));
Iterator it = ts.iterator();
while(it.hasNext()){
Person p=(Person)it.next();
System.out.println(p.getName()+”…”+p.getAge());
}
}
}
3.然后运行程序,但是却出现了Person cannot be cast to java.lang.Comparable的错误提示,于是打开API文档进行了查找,最后发现Comparable居然不是一个类,而是一个接口。
Comparable的定义是这样的:此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。
也就是说这个接口提供了一个compareTo的方法来进行自然排序,那么此时智言产生了一个疑问就是,compareTo方法是如何对元素进行排序的呢?于是智言又继续对compareTo方法进行查看,然后看到compareTo方法的定义为:比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
其实智言也看不懂是个什么意思,毕竟是新手嘛,所以还是亲自找度娘(百度)问了一下,最后才理解了Comparable接口和compareTo方法这两个知识要点。
那么智言还是以举例来说明一下:
1.首先我们需要实现Person类对Comparable接口的实现;
2.其次覆盖compareTo方法;
public class Person implements Comparable{
private String name;
private int age;
public int compareTo(Object o) {
Person p = (Person)o;
int temp = this.name.compareTo(p.name);
return temp==0?this.age-p.age:temp;
}
public Person(String name, int age){
super();
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;
}
}
那么这样就解决了所有该有的问题,今天又是由于时间原因,暂时写这么多,明天把下半部,也就是TreeSet的另外一种排序方式给各位分享出来,谢谢。
评论前必须登录!
注册