本章目标
掌握TreeSet的排序原理
掌握Set接口中重复元素的定义
关于TreeSet的排序说明
一个普通的类对象是不能向TreeSet集合中加入的,如果直接加入会出现以下的异常:
——java.lang.ClassCastException
如果要想使用TreeSet则对象所在的类必须实现Compable接口
排序类
import java.util.Set;
import java.util.TreeSet;
class Person implements Comparable<Person>{//定义 Person 类,实现比较器
private String name;//定义 name 属性
private int age;//定义 age 属性
public Person(String name, int age) {//通过构造方法为属性赋值
this.name = name;//为 name 属性赋值
this.age = age;//为 age 属性赋值
}
public String toString(){//覆写 toString() 方法
return "姓名:"+this.name+";年龄:"+this.age;
}
public int compareTo(Person per){//覆写 compareTo() 方法,指定排序规则
if(this.age > per.age){//按照年龄排序
return 1;
}else if(this.age <per.age){
return -1;
}else{
return 0;
}
}
}
public class TreeSetDemo03 {
public static void main(String[] args){
Set<Person> allSet = new TreeSet<Person>();//实例化 Set 接口对象
allSet.add(new Person("张三", 30));//加入元素
allSet.add(new Person("李四", 31));//加入元素
allSet.add(new Person("王五", 32));//加入元素
allSet.add(new Person("王五", 32));//重复元素,不能加入
allSet.add(new Person("王五", 32));//重复元素,不能加入
allSet.add(new Person("赵六", 33));//加入元素
allSet.add(new Person("孙七", 33));//年龄重复
System.out.println(allSet);//输出集合,调用 toString()
}
/* 结果:
* [姓名:张三;年龄:30, 姓名:李四;年龄:31, 姓名:王五;年龄:32, 姓名:赵六;年龄:33]
* */
}
关于重复元素的说明
Set接口中是不允许存放重复元素的
一个类的对象是否重复需要依靠Object类中的以下方法完成:
——hashCode():指定哈希码
——equals():对象比较
重复对象判断
import java.util.HashSet;
import java.util.Set;
class Person {//定义 Person 类,实现比较器
private String name;//定义 name 属性
private int age;//定义 age 属性
public Person(String name, int age) {//通过构造方法为属性赋值
this.name = name;//为 name 属性赋值
this.age = age;//为 age 属性赋值
}
public boolean equals(Object obj){//覆写 equals() 方法
if(this == obj){//地址相等
return true;//是同一个相等
}
if(!(obj instanceof Person)){//传递进来的不是本类的对象
return false;//不是同一个对象
}
Person p = (Person)obj;//进行向下转型
if(this.name.equals(p.name)&&this.age==p.age){
return true;//属性依次比较
}else{//全部属性相等,是同一对象
return false;//属性不相等,不是同一对象
}
}
public int hashCode(){//覆写 hashCode() 方法
return this.name.hashCode()*this.age;//指定编码公式
}
public String toString(){//覆写 toString() 方法
return "姓名:"+this.name+";年龄:"+this.age;
}
}
public class RepeatDemo02 {
public static void main(String[] args){
Set<Person> allSet = new HashSet<Person>();//实例化 Set 接口对象
allSet.add(new Person("张三", 30));//加入元素
allSet.add(new Person("李四", 31));//加入元素
allSet.add(new Person("王五", 32));//加入元素
allSet.add(new Person("王五", 32));//重复元素,不能加入
allSet.add(new Person("王五", 32));//重复元素,不能加入
allSet.add(new Person("赵六", 33));//加入元素
allSet.add(new Person("孙七", 33));//年龄重复
System.out.println(allSet);//输出集合,调用 toString()
}
/* 结果:
* [姓名:张三;姓名:30, 姓名:李四;姓名:31, 姓名:王五;姓名:32, 姓名:赵六;姓名:33]
* */
}