好贷网好贷款

[Java基础] 持有对象(集合框架)-Set-TreeSet

发布时间:2016-12-4 1:47:56 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"[Java基础] 持有对象(集合框架)-Set-TreeSet",主要涉及到[Java基础] 持有对象(集合框架)-Set-TreeSet方面的内容,对于[Java基础] 持有对象(集合框架)-Set-TreeSet感兴趣的同学可以参考一下。

Set 特点就是:无序,元素不可重复。TreeSet 是 Set 的一种,另外一种是HashSet。 TreeSet可以对Set集合中的元素进行排序。是如何进行排序的呢?TreeSet的底层结构为二叉树,何为二叉树?二叉树是每个节点最多有两个子树的有序树。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。值得注意的是,二叉树不是树的特殊情形。 二叉树能保证元素唯一性的依据就是:CompareTo方法中的return 0 ; TreeSet排序的第一种方式:让元素自身具备比较性元素需要实现Comparable接口,覆盖compareTo方法。这种方式也成为元素的自然顺序,或者叫做默认顺序。 class Student implements Comparable //该接口强制让学生具备比较性。 { private String name; private int age; Student(String name,int age) { this.name = name; this.age = age; } public int compareTo(Object obj) { //return 0; if(!(obj instanceof Student)) throw new RuntimeException("不是学生对象"); Student s = (Student)obj; System.out.println(this.name+"....compareto....."+s.name); if(this.age>s.age) return 1; if(this.age==s.age) { return this.name.compareTo(s.name); } return -1; /**/ } public String getName() { return name; } public int getAge() { return age; }          二叉树在存完全相同的对象时,不会存入!!!如("lisi007",20)不会存入! 取得过程:       需求: 往TreeSet集合中存储自定义对象学生(姓名,年龄)。 想按照学生的年龄进行排序。 记住,排序时,当主要条件相同时,一定判断一下次要条件。 TreeSet ts = new TreeSet(); ts.add(new Student("lisi02",22)); ts.add(new Student("lisi007",20)); 如果Student 只是一个普通的类,这样写会出现异常,因为TreeSet是带排序的,这样向TreeSet里面添加对象时,未指定按什么排序,如果是只含有一个属性,不会异常,现在会出现ClassCastException类型转换异常(运行时),Student类型无法转换为Comparable。Comparable为接口,此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。 TreeSet的第二种排序方式:当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性。定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。在集合初始化时,就有了比较方式。定义一个类,实现Comparator接口,覆盖compare方法。 需求:按照字符串长度排序。 字符串本身具备比较性。但是它的比较方式不是所需要的。 这时就只能使用比较器。 定义一个类,实现Comparator接口,覆盖compare方法。 class StrLenComparator implements Comparator { public int compare(Object o1,Object o2) { String s1 = (String)o1; String s2 = (String)o2; /* if(s1.length()>s2.length()) return 1; if(s1.length()==s2.length()) return 0; */ int num = new Integer(s1.length()).compareTo(new Integer(s2.length())); if(num==0) return s1.compareTo(s2);                   return num; } 定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。 TreeSet ts = new TreeSet(new StrLenComparator());                 ts.add("abcd"); ts.add("cc"); 当两种排序都存在时,以比较器为主。

上一篇:Struts2中DMI(动态方法调用)的一些问题
下一篇:为什么要get( int field)? 为什么不直接 getDay_Of_Week() ??

相关文章

相关评论