14、集合--TreeSet的使用和相关说明
TreeSet是SortedSet接口的唯一实现
可以确保集合元素处于排序状态
TreeSet并不是根据元素的插入顺序进行排序的
而是根据元素实际的值进行排序
与HashSet集合采用hash算法来决定元素的存储位置
TreeSet采用红黑树的数据结构进行排序处理
Treeset支持两种排序方法
1、自然排序
2、定制排序
需要实现CompareTo 接口方法
public int compareTo()
TressSet会调用每个元素的该方法比较,进而确定在集合中的位置
返回0 代表相等,返回负数当前元素小,整数当前元素属大
会增加系统的负担
测试:
public class Person implements Comparable { private String name; private int 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 String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } public Person(String name, int age) { this.name = name; this.age = age; } public Person(){ } public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Person other = (Person) obj; if (age != other.age) return false; if (name == null){ if (other.name != null){ return false; } }else if (!name.equals(other.name)){ return false; } return true; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0:name.hashCode()); return result; } @Override public int compareTo(Object o) { //按名字排序 if (o instanceof Person){ Person person = (Person) o; return this.name.compareTo(person.name); }else { throw new ClassCastException("不能进行强制类型转换"); } } }
public static void main(String[] args) { TreeSet set = new TreeSet(); set.add(new Person("aa",4)); set.add(new Person("cc",14)); set.add(new Person("ee",2)); set.add(new Person("bb",22)); set.add(new Person("dd",12)); Iterator it = set.iterator(); while(it.hasNext()){ Object o = it.next(); System.out.println(o); } }
如果要按照年龄进行排序:
此时直接修改Person中的方法:
@Override public int compareTo(Object o) { //按照年龄排序 if (o instanceof Person){ Person p = (Person) o; return this.age - p.age; }else { throw new ClassCastException("不能进行强制类型转换"); } }
此时的运行结果:
直接写compareTo方法
此时的Person不需要实现Comparable接口
public static void main(String[] args) {
Comparator comparator = new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Person && o2 instanceof Person){
Person p1= (Person) o1;
Person p2 = (Person) o2;
return p1.getAge() - p2.getAge();
}else {
throw new ClassCastException("不能进行强制类型转换");
}
}
};
TreeSet set = new TreeSet(comparator);
set.add(new Person("aa",4));
set.add(new Person("cc",14));
set.add(new Person("ee",2));
set.add(new Person("bb",22));
set.add(new Person("dd",12));
Iterator it = set.iterator();
while(it.hasNext()){
Object o = it.next();
System.out.println(o);
}
}