Java Set集合之Treeset
2014-08-21 10:57
435 查看
TreeSet它可以给Set集合中的元素进行指定方式的排序。
保证元素唯一性的方式:通过比较的结果是否为0.
底层数据结构是:二叉树。
排序的第一种方式:
让元素自身具备比较性。只要让元素实现Comparable接口,覆盖compareTo方法即可。
但是,如果元素自身不具备比较性,或者元素自身具备的比较性,不是所需要的。
比如,人的自然排序是按年龄排序,现在想要按照人的姓名排序。还可以不改动原有代码,此时可用第二种排列方式
排序的第二种方式:自定比较器的方式。
这时可以让集合自身具备比较性。
可以定义一个类实现Comparator接口,覆盖compare方法。将该Comparator接口子类对象作为实际参数传递给TreeSet集合构造函数。该对象就是比较器。
以下例子使用到了泛型,
第一种排列方式例子:People类实现的comparable接口具备了比较性,具体的排序规则是通过compareTo方法实现的
控制台结果:由于排序条件为:年龄小的优先,年龄一样再按照名称排序最终结果如下:
第二种排列方式例子:People类不管是否实现comparable接,即不管本身是否具备比较性,只要实例化TreeSet时实现Comparator接口,并重写compare方法,则最终排序将以compare方法中的规则排序,换句话说Comparator的优先级别高于Comparable,此时如果元素(People)实现了Comparable接口,其抽象方法compareTo将被覆盖.
模拟数据:构造TreeSet时传入实现了Comparator的类,此时People类中的compareTo方法已经不起作用,上面的代码是新的插入排序规则:
最终输出的结果如下:按照名字优先进行排序,名字相同再按照年龄排序
保证元素唯一性的方式:通过比较的结果是否为0.
底层数据结构是:二叉树。
排序的第一种方式:
让元素自身具备比较性。只要让元素实现Comparable接口,覆盖compareTo方法即可。
但是,如果元素自身不具备比较性,或者元素自身具备的比较性,不是所需要的。
比如,人的自然排序是按年龄排序,现在想要按照人的姓名排序。还可以不改动原有代码,此时可用第二种排列方式
排序的第二种方式:自定比较器的方式。
这时可以让集合自身具备比较性。
可以定义一个类实现Comparator接口,覆盖compare方法。将该Comparator接口子类对象作为实际参数传递给TreeSet集合构造函数。该对象就是比较器。
以下例子使用到了泛型,
第一种排列方式例子:People类实现的comparable接口具备了比较性,具体的排序规则是通过compareTo方法实现的
/** * Comparable接口,使得People本身具备比较性,具体如何排序通过重写{@link People#compareTo(People)} 实现排序 * * @author TOO-YOUNG-TOO-SIMPLE */ class People implements Comparable<People> { People(String name, int age) { this.name = name; this.age = age; } private String name; private int age; public String getName() { return name; } public int getAge() { return age; } /** * @return 0:表示重复元素 */ @Override public int compareTo(People o) { if (this.age == o.age) {// 年龄为排序首要条件,年龄相同下判断名字 return this.name.compareTo(o.name); } return this.age - o.age; } @Override public String toString() { return "People [name=" + name + ", age=" + age + "]"; } }模拟添加数据:
public static void main(String[] args) { TreeSet<People> people = new TreeSet<People>(); people.add(new People("tree3", 11)); people.add(new People("tree1", 12)); people.add(new People("tree2", 11)); people.add(new People("tree2", 15)); Iterator<People> p = people.iterator(); while (p.hasNext()) { System.out.println(p.next().toString()); } }
控制台结果:由于排序条件为:年龄小的优先,年龄一样再按照名称排序最终结果如下:
第二种排列方式例子:People类不管是否实现comparable接,即不管本身是否具备比较性,只要实例化TreeSet时实现Comparator接口,并重写compare方法,则最终排序将以compare方法中的规则排序,换句话说Comparator的优先级别高于Comparable,此时如果元素(People)实现了Comparable接口,其抽象方法compareTo将被覆盖.
/** * 实现Comparator接口重写{@link MyComp#compare(People, People)}方法实现排序规则 * * @author Administrator * */ class MyComp implements Comparator<People> { /** * @return 0:表示元素存在,大于0表示按插入顺序排序,小于0表示插入到上个元素前 */ @Override public int compare(People o1, People o2) { if (o1.getName().compareTo(o2.getName()) == 0) {// 首先判断名字是否相同,相同再判断年龄是否相同 return o1.getAge() - o2.getAge(); } return o1.getName().compareTo(o2.getName()); } }
模拟数据:构造TreeSet时传入实现了Comparator的类,此时People类中的compareTo方法已经不起作用,上面的代码是新的插入排序规则:
最终输出的结果如下:按照名字优先进行排序,名字相同再按照年龄排序
相关文章推荐
- Java基础之TreeSet集合使用泛型、比较器排序示例:
- 黑马程序员:Java基础——Set集合之TreeSet
- Java基础知识强化之集合框架笔记44:Set集合之TreeSet保证元素唯一性和自然排序的原理和图解
- java--集合框架的Hashset和Treeset
- java集合之TreeSet
- 黑马程序员 java基础之TreeSet集合
- Java基础 集合框架 共性方法 迭代器 ArrayList LinkedList Vector HashSet TreeSet
- Java基础知识强化之集合框架笔记45:Set集合之TreeSet存储自定义对象并遍历练习1(自然排序)
- Java集合之TreeSet
- Java集合之TreeSet
- 黑马程序员——java集合中的TreeSet
- JAVA提高教程(4)-认识Set集合之TreeSet
- java 集合框架(TreeSet操作,自动对数据进行排序,重写CompareTo方法)
- Java基础知识强化之集合框架笔记46:Set集合之TreeSet存储自定义对象并遍历练习2(自然排序)
- java学习笔记:集合框架之TreeSet
- JAVA学习第三十七课(常用对象API)— Set集合:TreeSet集合、比较器
- 黑马程序员java基础之集合Set中的TreeSet和泛型
- Java基础视频教程第15天_集合之TreeSet、泛型
- java中的TreeSet集合
- Java基础知识强化之集合框架笔记47:Set集合之TreeSet保证元素唯一性和比较器排序的原理及代码实现(比较器排序)