zoukankan      html  css  js  c++  java
  • 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中
        }
    
     
  • 相关阅读:
    筛选DataTable行重复
    还原数据库时在向服务器发送请求时发生传输级错误
    not in 语句 要 排除 null情况
    C#实现万年历(农历、节气、节日、星座、星宿、属相、生肖、闰年月、时辰)
    关于Form_Load和Public Form()那些事
    C#多线程编程简述(转载)
    标识列重置
    NET批量大数据插入性能分析及比较
    Asp.net 备份和还原SQL Server及压缩Access数据库
    线性查找(递归)
  • 原文地址:https://www.cnblogs.com/loaderman/p/6407398.html
Copyright © 2011-2022 走看看