1. 程式人生 > >JAVA高階基礎(9)---Set的典型實現(二):TreeSet

JAVA高階基礎(9)---Set的典型實現(二):TreeSet

TreeSet

TreeSet是基於TreeMap實現的。不是執行緒安全的。TreeSet可以使用元素的自然順序進行排序,或者定製排序

注:更多詳細方法請自行在 API 上查詢

排序方式

                  自然排序、定製排序

自然排序

實現 Comparable 介面,需要實現其 comparaTo() 方法。
                 Integer類:
                               compareTo(Integer o)
                               this  == o  返回0   this > o 返回大於0的值,   this < o  返回小於0的值
                 String類  :
                              compareTo(String str)
                             按照字典順序(字母表的順序)進行字串的比較        本質上比較的是字元的 Unicode 值

package org.lanqiao.setdemo;

public class Student {
	private String name;
	private Integer age;
	public Student() {
	}
	public Student(String name, int age) {
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	/*
	
	 * 實現compareTo方法。則是根據我們的比較規則,來定義,針對我們自己自定義的型別
	 * 進行比較的方式
	 * 1 我認為。如果兩個同學的年齡相等的話,那麼這兩個同學就是同一個人
	 * 2 如果年齡相等,則按照姓名的字典順序進行排序
	 */
	/*@Override
	public int compareTo(Object o) {
		Student st = (Student)o;
		int res =  age.compareTo(st.getAge());
		if(res == 0) {
			res =  name.compareTo(st.getName());
			
		}
		return res;
		
	}*/
	
}
package org.lanqiao.setdemo;

import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

public class TreeSetDemo {
	/*
	 * TreeSet 可以對存入其中的元素進行排序
	 * 排序的方式由兩種:自然排序,定製排序
	 * 自然排序:實現Comparable
	 */
	public static void main(String[] args) {
		Set set = new TreeSet();
		/*set.add(2);
		set.add(5);
		set.add(1);
		set.add(6);
		set.add(9);*/
		/*set.add("b");
		set.add("cd");
		set.add("bcd");
		set.add("abcd");*/
		/*Student stu1 = new Student("aa",21);
		Student stu2 = new Student("dd",18);
		Student stu3 = new Student("cc",18);
		Student stu4 = new Student("bb",22);
		Student stu5 = new Student("ff",19);
		set.add(stu1);
		set.add(stu2);
		set.add(stu3);
		set.add(stu4);
		set.add(stu5);*/
		set.add("李四");
		set.add("王五");
		set.add("張三");
		Iterator iter = set.iterator();
		while(iter.hasNext()) {
			System.out.println(iter.next());
			
		}
		char a = '張';
		System.out.println((int)a);
		char b = '王';
		System.out.println((int)b);
		char c = '李';
		System.out.println((int)c);
	}
}

定製排序

不是由儲存的資料型別來決定資料的排序方式,而是將資料的排序的方式交由容器來定義,不同的容器可以選擇不同的排序方式。

實現Comparator介面,實現 compare()

package org.lanqiao.setdemo;

import java.util.Comparator;

public class MyComparetor  implements Comparator{

	@Override
	public int compare(Object o1, Object o2) {
		Integer i1 = (Integer)o1;
		Integer i2 = (Integer)o2;
		return i1.compareTo(i2);
	}

}
package org.lanqiao.setdemo;

import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

public class TreeSetDemo2 {
	public static void main(String[] args) {
		Set  set = new  TreeSet(new Comparator() {

			@Override
			public int compare(Object o1, Object o2) {
				Student st1 = (Student)o1;
				Student st2 = (Student)o2;
				int res =  st1.getAge().compareTo(st2.getAge());
				if(res == 0) {
					res =  st1.getName().compareTo(st2.getName());
					
				}
				return res;
			}
			
			
		}) ;
		/*set.add(1);
		set.add(5);
		set.add(2);
		set.add(6);
		set.add(4);*/
		Student stu1 = new Student("aa",21);
		Student stu2 = new Student("dd",18);
		Student stu3 = new Student("cc",18);
		Student stu4 = new Student("bb",22);
		Student stu5 = new Student("ff",19);
		set.add(stu1);
		set.add(stu2);
		set.add(stu3);
		set.add(stu4);
		set.add(stu5);
		Iterator iter = set.iterator();
		
		while(iter.hasNext()) {
			System.out.println(iter.next());
			
		}
	}
	/*public class MyComparetor2  implements Comparator{

		@Override
		public int compare(Object o1, Object o2) {
			Integer i1 = (Integer)o1;
			Integer i2 = (Integer)o2;
			return i1.compareTo(i2);
		}

	}*/
}

實現方式有三種:

  1. 使用外部類來實現介面
  2. 使用內部類來實現介面
  3. 使用匿名內部類來實現介面