集合框架-TreeSet集合

ZHOU_VIP發表於2017-04-26

(3)TreeSet集合

TreeSet類概述

    使用元素的自然順序對元素進行排序

    或者根據建立set時提供的Comparator進行排序

    具體取決於使用的構造方法

A:底層資料結構是紅黑樹(是一個自平衡的二叉樹)

B:保證元素的排序方式

    a:自然排序(元素具備比較性)

        讓元素所屬的類實現Comparable介面

    b:比較器排序(集合具備比較性)

        讓集合構造方法接收Comparator的實現類物件

C:把我們講過的程式碼看一遍即可


package cn.itcast_05;

import java.util.TreeSet;

/*
 * TreeSet:能夠對元素按照某種規則進行排序。
 * 排序有兩種方式
 * A:自然排序
 * B:比較器排序
 * 
 * TreeSet集合的特點:排序和唯一
 * 
 * 通過觀察TreeSet的add()方法,我們知道最終要看TreeMap的put()方法。
 */
public class TreeSetDemo {
	public static void main(String[] args) {
		// 建立集合物件
		// 自然順序進行排序
		TreeSet<Integer> ts = new TreeSet<Integer>();

		// 建立元素並新增
		// 20,18,23,22,17,24,19,18,24
		ts.add(20);//自動裝箱,可以直接新增
		ts.add(18);
		ts.add(23);
		ts.add(22);
		ts.add(17);
		ts.add(24);
		ts.add(19);
		ts.add(18);
		ts.add(24);

		// 遍歷
		for (Integer i : ts) {
			System.out.println(i);
		}
	}
}


--------------------------------------------------------------------------------------------------------------------------


package cn.itcast_06;

import java.util.TreeSet;

/*
 * 需求:請按照姓名的長度排序
 */
public class TreeSetDemo {
	public static void main(String[] args) {
		// 建立集合物件
		TreeSet<Student> ts = new TreeSet<Student>();

		// 建立元素
		Student s1 = new Student("linqingxia", 27);
		Student s2 = new Student("zhangguorong", 29);
		Student s3 = new Student("wanglihong", 23);
		Student s4 = new Student("linqingxia", 27);
		Student s5 = new Student("liushishi", 22);
		Student s6 = new Student("wuqilong", 40);
		Student s7 = new Student("fengqingy", 22);
		Student s8 = new Student("linqingxia", 29);

		// 新增元素
		ts.add(s1);
		ts.add(s2);
		ts.add(s3);
		ts.add(s4);
		ts.add(s5);
		ts.add(s6);
		ts.add(s7);
		ts.add(s8);

		// 遍歷
		for (Student s : ts) {
			System.out.println(s.getName() + "---" + s.getAge());
		}
	}
}


package cn.itcast_05;

/*
 * 如果一個類的元素要想能夠進行自然排序,就必須實現自然排序介面
 */
public class Student implements Comparable<Student> {
    
    private String name;
    private int age;

    public Student() {
        super();
    }

    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = 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;
    }

    @Override
    public int compareTo(Student s) {
        // return 0;
        // return 1;
        // return -1;

        // 這裡返回什麼,其實應該根據我的排序規則來做
        // 按照年齡排序,主要條件
        int num = this.age - s.age;
        // 次要條件
        // 年齡相同的時候,還得去看姓名是否也相同,而姓名是String型別,本身已經實現了Comparable介面,直接拿來用就可以了
        // 如果年齡和姓名都相同,才是同一個元素
        int num2 = num == 0 ? this.name.compareTo(s.name) : num;
        return num2;
    }
    /*
     難點:要做自然排序,就必須去實現Comparable介面,
           寫主要條件和次要條件程式碼取決於我給出的排序條件
           還要知道次要條件的分析
    */
}

說明:

public int compareTo(Student  s){

     int  num = this.age - s.age;

     return num;

}

第一次this.age為27、s.age為27



第二次:this.age為29,但s.age還是為27,那麼以後的age都和第一次的27來比較了



---------------------------------------------------------------------------------------------------------------------------


package cn.itcast_06;

import java.util.TreeSet;

/*
 * 需求:請按照姓名的長度排序
 */
public class TreeSetDemo {
	public static void main(String[] args) {
		// 建立集合物件
		TreeSet<Student> ts = new TreeSet<Student>();

		// 建立元素
		Student s1 = new Student("linqingxia", 27);
		Student s2 = new Student("zhangguorong", 29);
		Student s3 = new Student("wanglihong", 23);
		Student s4 = new Student("linqingxia", 27);
		Student s5 = new Student("liushishi", 22);
		Student s6 = new Student("wuqilong", 40);
		Student s7 = new Student("fengqingy", 22);
		Student s8 = new Student("linqingxia", 29);

		// 新增元素
		ts.add(s1);
		ts.add(s2);
		ts.add(s3);
		ts.add(s4);
		ts.add(s5);
		ts.add(s6);
		ts.add(s7);
		ts.add(s8);

		// 遍歷
		for (Student s : ts) {
			System.out.println(s.getName() + "---" + s.getAge());
		}
	}
}


package cn.itcast_06;

/*
 * 如果一個類的元素要想能夠進行自然排序,就必須實現自然排序介面
 */
public class Student implements Comparable<Student> {
	private String name;
	private int age;

	public Student() {
		super();
	}

	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = 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;
	}

	@Override
	public int compareTo(Student s) {
		// 主要條件 姓名的長度
		int num = this.name.length() - s.name.length();
		// 姓名的長度相同,不代表姓名的內容相同
		int num2 = num == 0 ? this.name.compareTo(s.name) : num;
		// 姓名的長度和內容相同,不代表年齡相同,所以還得繼續判斷年齡
		int num3 = num2 == 0 ? this.age - s.age : num2;
		return num3;
	}
}

---------------------------------------------------------------------------------------------------------------------------

package cn.itcast_07;

import java.util.Comparator;
import java.util.TreeSet;

/*
 * 需求:請按照姓名的長度排序
 * 
 * TreeSet集合保證元素排序和唯一性的原理
 * 唯一性:是根據比較的返回是否是0來決定。
 * 排序:
 *         A:自然排序(元素具備比較性)
 *             讓元素所屬的類實現自然排序介面 Comparable
 *         B:比較器排序(集合具備比較性)
 *             讓集合的構造方法接收一個比較器介面的子類物件 Comparator
 */
public class TreeSetDemo {
    public static void main(String[] args) {
        // 建立集合物件
        // TreeSet<Student> ts = new TreeSet<Student>(); //自然排序
        // public TreeSet(Comparator comparator) //比較器排序
        // 定義個類比較器
        // TreeSet<Student> ts = new TreeSet<Student>(new MyComparator());

        // 如果一個方法的引數是介面,那麼真正要的是介面的實現類的物件
        // 而匿名內部類就可以實現這個東西,一般開發中用匿名內部類搞定
        TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                // 姓名長度
                int num = s1.getName().length() - s2.getName().length();
                // 姓名內容
                int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
                // 年齡
                int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
                return num3;
            }
        });

        // 建立元素
        Student s1 = new Student("linqingxia", 27);
        Student s2 = new Student("zhangguorong", 29);
        Student s3 = new Student("wanglihong", 23);
        Student s4 = new Student("linqingxia", 27);
        Student s5 = new Student("liushishi", 22);
        Student s6 = new Student("wuqilong", 40);
        Student s7 = new Student("fengqingy", 22);
        Student s8 = new Student("linqingxia", 29);

        // 新增元素
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        ts.add(s5);
        ts.add(s6);
        ts.add(s7);
        ts.add(s8);

        // 遍歷
        for (Student s : ts) {
            System.out.println(s.getName() + "---" + s.getAge());
        }
    }
}


package cn.itcast_07;

import java.util.Comparator;

public class MyComparator implements Comparator<Student> {
    
    //一般開發中用匿名內部類搞定,不需要重新定義個類比較器出來
    @Override
    public int compare(Student s1, Student s2) {
        // int num = this.name.length() - s.name.length();
        // this -- s1
        // s -- s2
        // 姓名長度,不在一個類中,用get拿
        int num = s1.getName().length() - s2.getName().length();
        // 姓名內容
        int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
        // 年齡
        int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
        return num3;
    }

}


package cn.itcast_07;

public class Student {
	private String name;
	private int age;

	public Student() {
		super();
	}

	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = 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;
	}
}

---------------------------------------------------------------------------------------------------------------------------

下面例子也是用匿名內部類的方法,源自:http://blog.csdn.net/wuya112709/article/details/51407754


public class Studentdemo {
	public static void main(String[] args) {
		TreeSet ts1 = new TreeSet(new Comparator() {
			
		public int compare(Object o1, Object o2) {
				Student s1 = (Student) o1;
				Student s2 = (Student) o2;
				return s1.age > s2.age ? 1 : -1;
			}
		});

		ts1.add(new Student("mm", 21, 97005));
		ts1.add(new Student("jerry", 19, 97003));
		ts1.add(new Student("tom", 16, 97004));
		ts1.add(new Student("mm", 28, 97008));
		ts1.add(new Student("mm", 23, 97006));
		System.out.println("語句return s1.age > s2.age ? 1 : -1;是按照???排列的:");
		System.out.println(ts1);

	}
}



相關文章