Java中的TreeSet是Set的一个子类,TreeSet集合是用来对象元素进行排序的,同样他也可以保证元素的唯一。 public static void demo() { TreeSet<Person> ts = new TreeSet<>(); ts.add(new Person("张三", 23)); ts.add(new Person("李四", 13)); ts.add(new Person("周七", 13)); ts.add(new Person("王五", 43)); ts.add(new Person("赵六", 33)); System.out.println(ts); }
执行结果: 出错,会抛出一个异常:java.lang.ClassCastException 显然是出现了类型转换异常。原因在于我们需要告诉TreeSet如何来进行比较元素,如果不指定,就会抛出这个异常
public class Person implements Comparable<Person> { private String name; private int age; ... public int compareTo(Person o) { return 0; //当compareTo方法返回0的时候集合中只有一个元素 return 1; //当compareTo方法返回正数的时候集合会怎么存就怎么取 return -1; //当compareTo方法返回负数的时候集合会倒序存储 } }
public int compareTo(Person o) { int num = this.age - o.age; //年龄是比较的主要条件 return num == 0 ? this.name.compareTo(o.name) : num;//姓名是比较的次要条件 }
按照姓名排序(依据Unicode编码大小),代码如下: public int compareTo(Person o) { int num = this.name.compareTo(o.name); //姓名是主要条件 return num == 0 ? this.age - o.age : num; //年龄是次要条件 }
public int compareTo(Person o) { int length = this.name.length() - o.name.length(); //比较长度为主要条件 int num = length == 0 ? this.name.compareTo(o.name) : length; //比较内容为次要条件 return num == 0 ? this.age - o.age : num; //比较年龄为次要条件 }
//定义一个类,实现Comparator接口,并重写compare()方法, class CompareByLen /*extends Object*/ implements Comparator<String> { @Override public int compare(String s1, String s2) { //按照字符串的长度比较 int num = s1.length() - s2.length(); //长度为主要条件 return num == 0 ? s1.compareTo(s2) : num; //内容为次要条件 } }
public static void demo4() { //需求:将字符串按照长度排序 TreeSet<String> ts = new TreeSet<>(new CompareByLen()); //Comparator c = new CompareByLen(); ts.add("aaaaaaaa"); ts.add("z"); ts.add("wc"); ts.add("nba"); ts.add("cba"); System.out.println(ts); }
总结
|
|