黑马程序员-java之TreeSet,Comparable,Comparator
2015-06-01 15:21
465 查看
-------------android培训、java培训、---------------
TreeSet可以对元素进行排序,缺省是按照自然排序进行排列,即元素必须实现Comparable接口,或者创建TreeSet对象的时候必须指定一个比较器
且元素唯一。
排序的两种方式:
方式一:让元素自身具备比较性,即让元素类实现Comparable接口,覆写compareTo(),这种排序方式是默认排序,也叫自然排序
方式二:当元素自身不具备比较性时,或者所具备的比较性不是实际需要的,这是就需要让集合TreeSet具备比较性,即在创建集合对象的时候指定比较器
当两种都存在时候,用比较器
原理:二叉树结构(左叉值小于右叉值),新元素大于原有元素,则放在叉的右边,小于则放在左边,等于则不存储
实例:存储自定义对象
代码:
package com.itheima;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
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 void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int compareTo(Object obj){//先按年龄比较,年龄相同则按名字自然排序
if(!(obj instanceof Student)){
throw new RuntimeException(obj.toString()+"不是学生");
}
Student stu = (Student)obj;
//System.out.println(this.name+"---compareTo---"+stu.name);
if(this.age>stu.age)
return 1;
if(this.age==stu.age){
return this.name.compareTo(stu.name);
}
return -1;
}
}
class myComparator implements Comparator{//先按姓名自然排序,姓名相同则按年龄升序排序
public int compare(Object o1,Object o2){
Student s1 = (Student)o1;
Student s2 = (Student)o2;
int num = s1.getName().compareTo(s2.getName());
if(num==0){
return new Integer(s1.getAge()).compareTo(s2.getAge());
}
return num;
}
}
public class TreeSetDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeSet ts = new TreeSet();//创建TreeSet对象
TreeSet ts2 = new TreeSet(new myComparator());
ts.add(new Student("zhangsan",18));//添加元素到对象ts
ts.add(new Student("lisi",22));
ts.add(new Student("wangwu",18));
ts.add(new Student("zhaoliu",19));
ts2.add(new Student("zhangsan",18));//添加元素到ts2
ts2.add(new Student("lisi",22));
ts2.add(new Student("wangwu",18));
ts2.add(new Student("zhaoliu",19));
ts2.add(new Student("wangwu",23));
Iterator it = ts.iterator();
Iterator it2 = ts2.iterator();
System.out.println("----------ts中的元素------------");
while(it.hasNext()){
Student stu = (Student)it.next();
System.out.println(stu.getName()+"---"+stu.getAge());
}
System.out.println("----------ts2中的元素------------");
while(it2.hasNext()){
Student stu2 = (Student)it2.next();
System.out.println(stu2.getName()+"---"+stu2.getAge());
}
}
}
TreeSet可以对元素进行排序,缺省是按照自然排序进行排列,即元素必须实现Comparable接口,或者创建TreeSet对象的时候必须指定一个比较器
且元素唯一。
排序的两种方式:
方式一:让元素自身具备比较性,即让元素类实现Comparable接口,覆写compareTo(),这种排序方式是默认排序,也叫自然排序
方式二:当元素自身不具备比较性时,或者所具备的比较性不是实际需要的,这是就需要让集合TreeSet具备比较性,即在创建集合对象的时候指定比较器
当两种都存在时候,用比较器
原理:二叉树结构(左叉值小于右叉值),新元素大于原有元素,则放在叉的右边,小于则放在左边,等于则不存储
实例:存储自定义对象
代码:
package com.itheima;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
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 void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int compareTo(Object obj){//先按年龄比较,年龄相同则按名字自然排序
if(!(obj instanceof Student)){
throw new RuntimeException(obj.toString()+"不是学生");
}
Student stu = (Student)obj;
//System.out.println(this.name+"---compareTo---"+stu.name);
if(this.age>stu.age)
return 1;
if(this.age==stu.age){
return this.name.compareTo(stu.name);
}
return -1;
}
}
class myComparator implements Comparator{//先按姓名自然排序,姓名相同则按年龄升序排序
public int compare(Object o1,Object o2){
Student s1 = (Student)o1;
Student s2 = (Student)o2;
int num = s1.getName().compareTo(s2.getName());
if(num==0){
return new Integer(s1.getAge()).compareTo(s2.getAge());
}
return num;
}
}
public class TreeSetDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeSet ts = new TreeSet();//创建TreeSet对象
TreeSet ts2 = new TreeSet(new myComparator());
ts.add(new Student("zhangsan",18));//添加元素到对象ts
ts.add(new Student("lisi",22));
ts.add(new Student("wangwu",18));
ts.add(new Student("zhaoliu",19));
ts2.add(new Student("zhangsan",18));//添加元素到ts2
ts2.add(new Student("lisi",22));
ts2.add(new Student("wangwu",18));
ts2.add(new Student("zhaoliu",19));
ts2.add(new Student("wangwu",23));
Iterator it = ts.iterator();
Iterator it2 = ts2.iterator();
System.out.println("----------ts中的元素------------");
while(it.hasNext()){
Student stu = (Student)it.next();
System.out.println(stu.getName()+"---"+stu.getAge());
}
System.out.println("----------ts2中的元素------------");
while(it2.hasNext()){
Student stu2 = (Student)it2.next();
System.out.println(stu2.getName()+"---"+stu2.getAge());
}
}
}
相关文章推荐
- 黑马程序员——String类和基本数据类型包装类
- 黑马程序员——单例设计模式
- 黑马程序员-框架技术实现的手段-反射基础
- 面试宝典
- 黑马程序员——Set集合+hashCode+比较器
- 黎活明给程序员的忠告(转)
- 给 程序员 的设计学习指南
- 黑马程序员_Java面向对象_包
- 面试题11:数值的整数次方
- 黑马程序员——多线程
- 程序员编程生涯中会犯的7个错误
- 聊聊做码农的这些年,时光飞逝岁月无痕
- 黑马程序员-Java之HashSet
- 程序员在他们的软件开发生涯中最常犯的7个错误
- 面试题25:二叉树中和为某一值的路径
- Java程序员也应该知道的系统知识系列之内存
- 黑马程序员——继承,抽象,接口
- 【杂文】 职业生涯中的五个坎
- 易到用车面试总结(android)
- 史上最详细 最基础的 android 面试 知识点总结(二)