数据库中有很多数据:
userid name birth
-----------------------1 zs 1980-11-112 ls 1980-10-113 ww 1981-11-114 zl 2001-12-23
编写程序从数据库当中取出数据,在页面展示用户信息的时候按照生日升序或者降序。
这个时候可以使用TreeSet集合,因为TreeSet集合放进去,拿出来是有序的
TreeSet集合,对自定义类型不能进行排序!!!
example:
public class TreeSetTest03
public static void main(String[] args)
Person p1 = new Person(32);
Person p2 = new Person(20);
Person p3 = new Person(25);
TreeSet<Person> ts = new TreeSet<>();
ts.add(p1);
ts.add(p2);
ts.add(p3);
for (Person x:
ts)
System.out.println(x);
class Person
int age;
public Person(int age)
this.age = age;
// 重写toString方法
@Override
public String toString()
return "Person" +
"age=" + age +
'';
运行结果:
Exception in thread "main"java.lang.ClassCastException:com.lxz.review1.Person cannot be cast tojava.lang.Comparable
at java.util.TreeMap.compare(TreeMap.java:1294)
at java.util.TreeMap.put(TreeMap.java:538)
at java.util.TreeSet.add(TreeSet.java:255)
at com.lxz.review1.TreeSetTest03.main(TreeSetTest03.java:23)
程序运行结果抛出了一个异常:Person cannot be cast to java.lang.Comparable.程序无法进行排序是因为没有指定自定义类型Person对象之间的比较规则,谁大谁小没有说明!
在TreeSet中实现自定义类型的排序有两种方法
方式一:放在TreeSet集合中的元素需要实现java.lang.Comparable接口
public class TreeSetTest04
public static void main(String[] args)
Person1 p1 = new Person1(32);
Person1 p2 = new Person1(20);
Person1 p3 = new Person1(25);
TreeSet<Person1> ts = new TreeSet<>();
ts.add(p1);
ts.add(p2);
ts.add(p3);
for (Person1 x:
ts)
System.out.println(x);
/**
* 放在TreeSet集合中的元素需要实现java.lang.Comparable接口
* 并且实现compareTo方法。equals可以不写
*/
class Person1 implements Comparable<Person1>
int age;
public Person1(int age)
this.age = age;
// 重写toString方法
@Override
public String toString()
return "Person1" +
"age=" + age +
'';
/**
* 需要在这个比较的方法中编写比较的逻辑或者比较的规则,按照什么进行比较
* 拿着参数k和集合中的每一个key进行比较,返回值可能是大于0 小于0 或者等于0
* 比较规则最终还是由程序员指定的; 例如按照年龄升序,或者按照年龄降序。
* @param o
* @return
*/
@Override
public int compareTo(Person1 o) // c1.compareTo(c2)
return this.age-o.age; // >0 =0 <0 都有可能
方式二:在构造器TreeSet或者TreeMap集合的时候给它传一个比较器对象
public class TreeSetTest06
public static void main(String[] args)
// 此时创建TreeSet集合的时候,需要使用这个比较器。
// TreeSet<WuGui> wuGui = new TreeSet<>(); // 这样不行,没有通过构造方法传递一个比较器进去。
// 给构造方法传递一个比较器
TreeSet<WuGui> wuGui = new TreeSet<>(new WuGuiComparator()); // 底层源码可知其中一个构造方法的参数为比较器
// 大家可以使用匿名内部类的方式
wuGui.add(new WuGui(100));
wuGui.add(new WuGui(10));
wuGui.add(new WuGui(1000));
for (WuGui wugui:
wuGui)
System.out.println(wugui);
class WuGui
int age;
public WuGui(int age)
this.age = age;
@Override
public String toString()
return "WuGui" +
"age=" + age +
'';
// 单独再这里编写一个比较器
// 比较器实现java.util.Comparator接口 (Comparable是java.lang包下的。Comparator是java.util包下的。)
class WuGuiComparator implements Comparator<WuGui>
@Override
public int compare(WuGui o1, WuGui o2)
// 指定比较规则
// 按照年龄排序
return o1.age-o2.age;
import java.util.Iterator;
import java.util.*;
public class TreeSetTest {
public static void main(String[] args) {
Set ts = new TreeSet();
ts.add("abc");
ts.add("xyz");
ts.add("rst");
Iterator it = ts.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}