排序:指定按照某种算法对运行进行排序
有序:指的是存储顺序和取出的顺序一致
特点: 可以对元素进行排序 , 而排序分为两种方式
1. 自然排序
* TreeSet类的add()方法中会把存入的对象提升为Comparable类型
* 调用对象的compareTo()方法和集合中的对象比较
* 根据compareTo()方法返回的结果进行存储
2. 比较器排序
* 创建TreeSet的时候可以制定 一个Comparator
* 如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序
* add()方法内部会自动调用Comparator接口中compare()方法排序
* 调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数
那么我们到底使用的是自然排序还是比较器排序 , 取决于我们在创建TreeSet集合对象的时候所选定的构造方法
如果我们选择是无参的构造方法,那么我们使用的就是自然排序 , 如果我们选择的是接收一个Comparator参数的构造方法
那么我们使用的就是比较器排序
如果我们选择的是自然排序对元素有要求 , 要求元素必须去实现Comparable这个接口
TreeSet 保证元素唯一性依赖于compareTo 或者 compare方法的返回值是否为 0
两种方式的区别
* TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)
* TreeSet如果传入Comparator, 就优先按照Comparator
import java.util.Comparator; import java.util.TreeSet; import com.heiam.bean.Person; public class Demo3_TreeSet { /** * @param args * TreeSet集合是用来对象元素进行排序的,同样他也可以保证元素的唯一 * 当compareTo方法返回0的时候集合中只有一个元素 * 当compareTo方法返回正数的时候集合会怎么存就怎么取 * 当compareTo方法返回负数的时候集合会倒序存储 */ public static void main(String[] args) { //demo1(); //demo2(); //demo3(); //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); } public static void demo4() { TreeSet<Person> ts = new TreeSet<>(); ts.add(new Person("zhangsan", 23)); ts.add(new Person("lisi", 13)); ts.add(new Person("wangwu", 33)); ts.add(new Person("zhaoliu", 43)); ts.add(new Person("aaaa", 53)); System.out.println(ts); } public static void demo3() { TreeSet<Person> ts = new TreeSet<>(); ts.add(new Person("李四", 13)); ts.add(new Person("张三", 23)); ts.add(new Person("王五", 43)); ts.add(new Person("赵六", 33)); System.out.println('张' + 0); System.out.println('李' + 0); System.out.println('王' + 0); System.out.println('赵' + 0); System.out.println(ts); } public static void demo2() { 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); } public static void demo1() { TreeSet<Integer> ts = new TreeSet<>(); ts.add(3); ts.add(1); ts.add(1); ts.add(2); ts.add(2); ts.add(3); ts.add(3); System.out.println(ts); } } 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 main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("ccc"); list.add("ccc"); list.add("aaa"); list.add("aaa"); list.add("bbb"); list.add("ddd"); list.add("ddd"); sort(list); System.out.println(list); } /* * 对集合中的元素排序,并保留重复 * 1,void * 2,List<String> list */ public static void sort(List<String> list) { TreeSet<String> ts = new TreeSet<>(new Comparator<String>() { //定义比较器(new Comparator(){}是Comparator的子类对象) @Override public int compare(String s1, String s2) { //重写compare方法 int num = s1.compareTo(s2); //比较内容 return num == 0 ? 1 : num; //如果内容一样返回一个不为0的数字即可 } }); ts.addAll(list); //将list集合中的所有元素添加到ts中 list.clear(); //清空list list.addAll(ts); //将ts中排序并保留重复的结果在添加到list中 }