集合框架-TreeSet集合
来源:互联网 发布:白贺翔 java架构师 编辑:程序博客网 时间:2024/06/06 00:24
(3)TreeSet集合
TreeSet类概述
使用元素的自然顺序对元素进行排序
或者根据创建set时提供的Comparator进行排序
具体取决于使用的构造方法
A:底层数据结构是红黑树(是一个自平衡的二叉树)
B:保证元素的排序方式
a:自然排序(元素具备比较性)
让元素所属的类实现Comparable接口
b:比较器排序(集合具备比较性)
让集合构造方法接收Comparator的实现类对象
C:把我们讲过的代码看一遍即可
package cn.itcast_05;import java.util.TreeSet;/* * TreeSet:能够对元素按照某种规则进行排序。 * 排序有两种方式 * A:自然排序 * B:比较器排序 * * TreeSet集合的特点:排序和唯一 * * 通过观察TreeSet的add()方法,我们知道最终要看TreeMap的put()方法。 */public class TreeSetDemo {public static void main(String[] args) {// 创建集合对象// 自然顺序进行排序TreeSet<Integer> ts = new TreeSet<Integer>();// 创建元素并添加// 20,18,23,22,17,24,19,18,24ts.add(20);//自动装箱,可以直接添加ts.add(18);ts.add(23);ts.add(22);ts.add(17);ts.add(24);ts.add(19);ts.add(18);ts.add(24);// 遍历for (Integer i : ts) {System.out.println(i);}}}
--------------------------------------------------------------------------------------------------------------------------
package cn.itcast_06;import java.util.TreeSet;/* * 需求:请按照姓名的长度排序 */public class TreeSetDemo {public static void main(String[] args) {// 创建集合对象TreeSet<Student> ts = new TreeSet<Student>();// 创建元素Student s1 = new Student("linqingxia", 27);Student s2 = new Student("zhangguorong", 29);Student s3 = new Student("wanglihong", 23);Student s4 = new Student("linqingxia", 27);Student s5 = new Student("liushishi", 22);Student s6 = new Student("wuqilong", 40);Student s7 = new Student("fengqingy", 22);Student s8 = new Student("linqingxia", 29);// 添加元素ts.add(s1);ts.add(s2);ts.add(s3);ts.add(s4);ts.add(s5);ts.add(s6);ts.add(s7);ts.add(s8);// 遍历for (Student s : ts) {System.out.println(s.getName() + "---" + s.getAge());}}}
package cn.itcast_05;/* * 如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口 */public class Student implements Comparable<Student> { private String name; private int age; public Student() { super(); } public Student(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; } @Override public int compareTo(Student s) { // return 0; // return 1; // return -1; // 这里返回什么,其实应该根据我的排序规则来做 // 按照年龄排序,主要条件 int num = this.age - s.age; // 次要条件 // 年龄相同的时候,还得去看姓名是否也相同,而姓名是String类型,本身已经实现了Comparable接口,直接拿来用就可以了 // 如果年龄和姓名都相同,才是同一个元素 int num2 = num == 0 ? this.name.compareTo(s.name) : num; return num2; } /* 难点:要做自然排序,就必须去实现Comparable接口, 写主要条件和次要条件代码取决于我给出的排序条件 还要知道次要条件的分析 */}
说明:public int compareTo(Student s){ int num = this.age - s.age; return num;}
第一次this.age为27、s.age为27第二次:this.age为29,但s.age还是为27,那么以后的age都和第一次的27来比较了
---------------------------------------------------------------------------------------------------------------------------
package cn.itcast_06;import java.util.TreeSet;/* * 需求:请按照姓名的长度排序 */public class TreeSetDemo {public static void main(String[] args) {// 创建集合对象TreeSet<Student> ts = new TreeSet<Student>();// 创建元素Student s1 = new Student("linqingxia", 27);Student s2 = new Student("zhangguorong", 29);Student s3 = new Student("wanglihong", 23);Student s4 = new Student("linqingxia", 27);Student s5 = new Student("liushishi", 22);Student s6 = new Student("wuqilong", 40);Student s7 = new Student("fengqingy", 22);Student s8 = new Student("linqingxia", 29);// 添加元素ts.add(s1);ts.add(s2);ts.add(s3);ts.add(s4);ts.add(s5);ts.add(s6);ts.add(s7);ts.add(s8);// 遍历for (Student s : ts) {System.out.println(s.getName() + "---" + s.getAge());}}}
package cn.itcast_06;/* * 如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口 */public class Student implements Comparable<Student> {private String name;private int age;public Student() {super();}public Student(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;}@Overridepublic int compareTo(Student s) {// 主要条件 姓名的长度int num = this.name.length() - s.name.length();// 姓名的长度相同,不代表姓名的内容相同int num2 = num == 0 ? this.name.compareTo(s.name) : num;// 姓名的长度和内容相同,不代表年龄相同,所以还得继续判断年龄int num3 = num2 == 0 ? this.age - s.age : num2;return num3;}}
---------------------------------------------------------------------------------------------------------------------------package cn.itcast_07;import java.util.Comparator;import java.util.TreeSet;/* * 需求:请按照姓名的长度排序 * * TreeSet集合保证元素排序和唯一性的原理 * 唯一性:是根据比较的返回是否是0来决定。 * 排序: * A:自然排序(元素具备比较性) * 让元素所属的类实现自然排序接口 Comparable * B:比较器排序(集合具备比较性) * 让集合的构造方法接收一个比较器接口的子类对象 Comparator */public class TreeSetDemo { public static void main(String[] args) { // 创建集合对象 // TreeSet<Student> ts = new TreeSet<Student>(); //自然排序 // public TreeSet(Comparator comparator) //比较器排序 // 定义个类比较器 // TreeSet<Student> ts = new TreeSet<Student>(new MyComparator()); // 如果一个方法的参数是接口,那么真正要的是接口的实现类的对象 // 而匿名内部类就可以实现这个东西,一般开发中用匿名内部类搞定 TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() { @Override public int compare(Student s1, Student s2) { // 姓名长度 int num = s1.getName().length() - s2.getName().length(); // 姓名内容 int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num; // 年龄 int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2; return num3; } }); // 创建元素 Student s1 = new Student("linqingxia", 27); Student s2 = new Student("zhangguorong", 29); Student s3 = new Student("wanglihong", 23); Student s4 = new Student("linqingxia", 27); Student s5 = new Student("liushishi", 22); Student s6 = new Student("wuqilong", 40); Student s7 = new Student("fengqingy", 22); Student s8 = new Student("linqingxia", 29); // 添加元素 ts.add(s1); ts.add(s2); ts.add(s3); ts.add(s4); ts.add(s5); ts.add(s6); ts.add(s7); ts.add(s8); // 遍历 for (Student s : ts) { System.out.println(s.getName() + "---" + s.getAge()); } }}
package cn.itcast_07;import java.util.Comparator;public class MyComparator implements Comparator<Student> { //一般开发中用匿名内部类搞定,不需要重新定义个类比较器出来 @Override public int compare(Student s1, Student s2) { // int num = this.name.length() - s.name.length(); // this -- s1 // s -- s2 // 姓名长度,不在一个类中,用get拿 int num = s1.getName().length() - s2.getName().length(); // 姓名内容 int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num; // 年龄 int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2; return num3; }}
package cn.itcast_07;public class Student {private String name;private int age;public Student() {super();}public Student(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;}}
---------------------------------------------------------------------------------------------------------------------------下面例子也是用匿名内部类的方法,源自:http://blog.csdn.net/wuya112709/article/details/51407754
public class Studentdemo {public static void main(String[] args) {TreeSet ts1 = new TreeSet(new Comparator() {public int compare(Object o1, Object o2) {Student s1 = (Student) o1;Student s2 = (Student) o2;return s1.age > s2.age ? 1 : -1;}});ts1.add(new Student("mm", 21, 97005));ts1.add(new Student("jerry", 19, 97003));ts1.add(new Student("tom", 16, 97004));ts1.add(new Student("mm", 28, 97008));ts1.add(new Student("mm", 23, 97006));System.out.println("语句return s1.age > s2.age ? 1 : -1;是按照???排列的:");System.out.println(ts1);}}
0 0
- 集合框架--TreeSet集合
- 集合框架-TreeSet集合
- Java 集合框架-TreeSet
- 集合框架(TreeSet练习)
- java 集合框架-TreeSet
- Java集合框架-Set(TreeSet)
- 总结:集合框架(TreeSet)
- java 集合框架-TreeSet练习
- java集合框架系列---TreeSet
- 集合框架__【Set集合】【HashSet】【TreeSet】
- 集合框架__【Set集合】【HashSet】【TreeSet】
- 集合框架--TreeSet集合Comparator比较器
- API集合框架-Set集合之TreeSet
- TreeSet 集合
- TreeSet集合,
- 集合 --- TreeSet
- TreeSet集合
- TreeSet集合
- git bash下出现错误Error: Cannot find module 'git目录/node_modules/git包/bin/git包'
- File.io读取文件(五)
- 并查集(Union—find)算法实现简单的迷宫
- C++中map遍历的两种方式
- Mac 使用 NFS 连接 Centos/RedHat 上的共享文件夹
- 集合框架-TreeSet集合
- 微信公众号授权
- 使用CMD实现批量重命名
- Zephyr 物联网操作系统环境搭建
- Redis监控
- 剑指Offer的旋转数组的最小数字问题是要二分法解决
- SQL 语句转换格式函数Cast、Convert
- Protocol message was toolarge. May be malicious. Use CodedInputStream.setSizeLimit() to increase ...
- 微信端开发 操作步奏