TreeSet的两种排序方式

来源:互联网 发布:景安备案域名购买 编辑:程序博客网 时间:2024/06/11 23:07

一、
TreeSet可以实现对元素按照一定规则排序
如下代码:

import java.util.TreeSet;public class TreeSetTest {    public static void main(String[] args) {        TreeSet<Integer> set=new TreeSet<Integer>();        set.add(1);        set.add(9);        set.add(8);        set.add(-5);        set.add(10);        set.add(2);        set.forEach(System.out::println);    }}

执行结果:

-5128910

实现排序,升序排序。

那对于自定义的对象呢?
如下代码:

import java.util.TreeSet;public class TreeSetTest {    public static void main(String[] args) {        TreeSet<User> set=new TreeSet<User>();        set.add(new User("aaa", 15));        set.add(new User("bbb", 19));        set.add(new User("ccc", 7));        set.add(new User("ddd", 18));        set.forEach(System.out::println);    }}class User{    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;    }    public User(String name, int age) {        super();        this.name = name;        this.age = age;    }    public User() {        super();        // TODO Auto-generated constructor stub    }    @Override    public String toString() {        return "User [name=" + name + ", age=" + age + "]";    }}

运行报错:

Exception in thread "main" java.lang.ClassCastException: test.User cannot be cast to java.lang.Comparable    at java.util.TreeMap.compare(TreeMap.java:1290)    at java.util.TreeMap.put(TreeMap.java:538)    at java.util.TreeSet.add(TreeSet.java:255)    at test.TreeSetTest.main(TreeSetTest.java:9)

由于不知道按照什么方式排序,所以报错了

实现排序的两种方式:
1、自然排序
2、比较器排序

二、自然排序
具体两个步骤:
1、User类实现Comparable接口
2、重写compareTo()方法,返回0,相等,返回正,此对象大于另一个对象,返回负,此对象小于另一个对象。结果升序排序

代码如下:

package test;import java.util.TreeSet;public class TreeSetTest {    public static void main(String[] args) {        TreeSet<User> set=new TreeSet<User>();        set.add(new User("aaa", 15));        set.add(new User("bbb", 19));        set.add(new User("ccc", 7));        set.add(new User("ddd", 18));        set.forEach(System.out::println);    }}class User implements Comparable<User>{    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;    }    public User(String name, int age) {        super();        this.name = name;        this.age = age;    }    public User() {        super();        // TODO Auto-generated constructor stub    }    @Override    public String toString() {        return "User [name=" + name + ", age=" + age + "]";    }    @Override    public int compareTo(User o) {        //根据年龄排序        return this.age>o.age?1:-1;    }}

结果:

User [name=ccc, age=7]User [name=aaa, age=15]User [name=ddd, age=18]User [name=bbb, age=19]

实现了排序

三、比较器排序

两个步骤:
1、定义一个比较器类,实现Comparator接口,重写compare接口
2、使用下面的构造器new TreeSet

TreeSet(Comparator

import java.util.Comparator;import java.util.TreeSet;public class TreeSetTest {    public static void main(String[] args) {        TreeSet<User> set=new TreeSet<User>(new UserCompare());        set.add(new User("aaa", 15));        set.add(new User("bbb", 19));        set.add(new User("ccc", 7));        set.add(new User("ddd", 18));        set.forEach(System.out::println);    }}class User{    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;    }    public User(String name, int age) {        super();        this.name = name;        this.age = age;    }    public User() {        super();        // TODO Auto-generated constructor stub    }    @Override    public String toString() {        return "User [name=" + name + ", age=" + age + "]";    }}class UserCompare implements Comparator<User>{    @Override    public int compare(User o1, User o2) {        // TODO Auto-generated method stub        return o1.getAge()>o2.getAge()?1:-1;    }}

结果:

User [name=ccc, age=7]User [name=aaa, age=15]User [name=ddd, age=18]User [name=bbb, age=19]

实现了排序

List默认是不排序的,也可以通过这两种排序方式实现排序。
1、自然排序
实现Comparable接口
重写compareTo()方法,返回0,相等,返回正,此对象大于另一个对象,返回负,此对象小于另一个对象。结果升序排序
Collections.sort(list)

2、比较器排序
、定义一个比较器类,实现Comparator接口,重写compare接口
Collections.sort(list,comparator)