Chinaunix首页 | 论坛 | 博客
  • 博客访问: 351833
  • 博文数量: 51
  • 博客积分: 2011
  • 博客等级: 大尉
  • 技术积分: 613
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-06 17:19
文章分类

全部博文(51)

文章存档

2011年(1)

2010年(3)

2009年(27)

2008年(20)

我的朋友

分类:

2009-10-23 15:37:27

集合学习一Set集合-treeSet
2009-08-13 13:22

Set集合中的treeSet里面不但继承了Set中的方法还有一些自己的方法

boolean ( e)
           将指定的元素添加到此 set(如果该元素尚未存在于 set 中)。
boolean (> c)
           将指定 collection 中的所有元素添加到此 set 中。
( e)
           返回此 set 中大于等于给定元素的最小元素;如果不存在这样的元素,则返回 null
void ()
           移除此 set 中的所有元素。
()
           返回 TreeSet 实例的浅表副本。
> ()
           返回对此 set 中的元素进行排序的比较器;如果此 set 使用其元素的,则返回 null
boolean ( o)
           如果此 set 包含指定的元素,则返回 true
<> ()
           返回在此 set 元素上按降序进行迭代的迭代器。
<> ()
           返回此 set 中所包含元素的逆序视图。
()
           返回此 set 中当前第一个(最低)元素。
( e)
           返回此 set 中小于等于给定元素的最大元素;如果不存在这样的元素,则返回 null
<> ( toElement)
           返回此 set 的部分视图,其元素严格小于 toElement
<> ( toElement, boolean inclusive)
           返回此 set 的部分视图,其元素小于(或等于,如果 inclusive 为 true)toElement
( e)
           返回此 set 中严格大于给定元素的最小元素;如果不存在这样的元素,则返回 null
boolean ()
           如果此 set 不包含任何元素,则返回 true
<> ()
           返回在此 set 中的元素上按升序进行迭代的迭代器。
()
           返回此 set 中当前最后一个(最高)元素。
( e)
           返回此 set 中严格小于给定元素的最大元素;如果不存在这样的元素,则返回 null
()
           获取并移除第一个(最低)元素;如果此 set 为空,则返回 null
()
           获取并移除最后一个(最高)元素;如果此 set 为空,则返回 null
boolean ( o)
           将指定的元素从 set 中移除(如果该元素存在于此 set 中)。
int ()
           返回 set 中的元素数(set 的容量)。
<> ( fromElement, boolean fromInclusive, toElement, boolean toInclusive)
           返回此 set 的部分视图,其元素范围从 fromElementtoElement
<> ( fromElement, toElement)
           返回此 set 的部分视图,其元素从 fromElement(包括)到 toElement(不包括)。
<> ( fromElement)
           返回此 set 的部分视图,其元素大于等于 fromElement
<> ( fromElement, boolean inclusive)
           返回此 set 的部分视图,其元素大于(或等于,如果 inclusive 为 true)fromElement

注意,TreeSet集合有自然排序功能,即是对元素进行自然排序

同样用代码来进行解释:

import java.util.*;

package myPack

class myTreeSet{

public static void main(String[] args){

TreeSet   ts = new TreeSet();

ts.add("ax");

ts.add("nj");

ts.add("wz");

ts.add("cd");

for(Iterator it = ts.iterator();it.hasNext();){

System.out.println(it.next());}}}

显示结果为:ax   cd    nj   wz由结果看出是对字母的自然顺序排序的。

但日常开发的用TreeSet用来装元素装的是自定义对象,现在就用它来装自定久对象

描述一个学生类

class Student{

private String name;

private int age;

Student(String name,int age){

this.name = name;

this.age = age;

}

public String getName(){

return name;}

public int getAge(){

return age;}public String toString(){

return name+"--"+age;}}

//主函数

import java.util.*;

package myPack

class myTreeSet{

public static void main(String[] args){

TreeSet   ts = new TreeSet();

ts.add(new Student("cd",30));

ts.add(new Student("au",23));

ts.add(new Student("io",21));

ts.add(new Student("ht",26));

for(Iterator it = ts.iterator();it.hasNext();){

System.out.println(it.next());}}}

其结果出错:Exception in thread "main" java.lang.ClassCastException: Student cannot be cast
to java.lang.Comparable
        at java.util.TreeMap.put(Unknown Source)
        at java.util.TreeSet.add(Unknown Source)
        at myTreeSet.main(myTreeSet.java:8)

报了个类转换异常,Student cannot be cast to java.lang.Comparable??这是为什么呢?但如果存入一个元素,又能正常运行,但一个以上就不行,这是因为TreeSet要对元素进行排序,而又找不到排序方法。

注意, TreeSet拥有自然排序功能,是它自我封装了一个排序方法。

注意,如果要正确实现 Set 接口,则 set 维护的顺序(无论是否提供了显式比较器)必须与 equals 一致。(关于与 equals 一致 的精确定义,请参阅 ComparableComparator。)这是因为 Set 接口是按照 equals 操作定义的,但 TreeSet 实例使用它的 compareTo(或 compare)方法对所有元素进行比较,因此从 set 的观点来看,此方法认为相等的两个元素就是相等的。即使 set 的顺序与 equals 不一致,其行为也 定义良好的;它只是违背了 Set 接口的常规协定。

这是API文档中的一段话,所以自定义对象必须实现Comparable 接口,它里面有个CompareTo()方法。

int ( o)
           比较此对象与指定对象的顺序。
比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。

所以自定义对象中必须实现Comparable 接口,

class Student implements Comparable

{

private String name;

private int age;

Student(String name,int age){

this.name = name;

this.age = age;

}

public String getName(){

return name;}

public int getAge(){

return age;}public String toString(){

return name+"--"+age;

public int CompareTo(Object obj){

Student s = (Student)obj;

if(this.age>s.age)

return 1;

else if(this.age==s.age)

return this.name.compareTo(s.name);//这里的compareTo方法是String中的,String已实现Comparable接口,按照字母顺序来排序的。它返回的也是int(1,,0,,-1)同时实现了对字母排序。比如,有年龄相同的姓名不相同的元素,那么就会按字母顺序来排,如果都一样,则就是同一元素

else

return -1;

}

}}

总结:TreeSet有排序功能,所以自定义对象中必须实现Comparable 接口,并重写compareTo()方法,
阅读(3485) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~