TreeSet

排序:指定按照某种算法对运行进行排序


有序:指的是存储顺序和取出的顺序一致


特点: 可以对元素进行排序 , 而排序分为两种方式

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中
    }
 
原文地址:https://www.cnblogs.com/loaderman/p/6407398.html