天天看點

黑馬程式員——集合架構(TreeSet)

-----------android教育訓練、java教育訓練、java學習型技術部落格、期待與您交流!------------

Set:無序,不可以重複元素。

|——HashSet:資料結構是哈希表。線程是非同步的。

保證元素唯一性的原理:判斷元素的hashCode是否相同。

如果相同,還會繼續判斷元素的equals方法,是否為true。

|——TreeSet:可以對Set集合中的元素進行排序。

底層資料結構是二叉樹。

保證元素唯一性的依據。

通過對象中的compareTo方法确定元素的大小,和确定是否相同。

TreeSet排序的第一種方式:讓元素自身具備比較性。元素需要實作Comparable接 口,覆寫compareTo方法。這種方式也稱為元素的自然順序,或者叫作預設順 序。

TreeSet集合的第二種排序方式。

當元素自身不具備比較性時,或者具備的比較性不是所需要的。

這時就需要讓集合自身具備比較性。

在集合初始化時就有了比較方式。

TreeSet增加元素示例:

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


public class TreeSetDemo {

	public static void main(String[] args) 
	{
		TreeSet ts = new TreeSet();
		
		ts.add("cba");
		ts.add("aaa");
		ts.add("bca");
		ts.add("abcd");
		
		Iterator it = ts.iterator();
		while(it.hasNext())
			System.out.println(it.next());
	}
}
           

控制台顯示結果:

aaa

abcd

   bca

   cba

有結果可知TreeSet預設實作自然排序。

向TreeSet集合中添入自定義對象。

此對象必須實作Comparable接口的方法,compareTo();

排序時,當主要條件相同時,一定要判斷一下次要條件。

程式舉例:

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


public class TreeSetDemo {

	public static void main(String[] args) 
	{

		TreeSet<Student> ts = new TreeSet<Student>();
		
		ts.add(new Student("lisi01",18));
		ts.add(new Student("lisi02",19));
		ts.add(new Student("lisi04",18));
		ts.add(new Student("lisi04",18));
		
		Iterator<Student> it = ts.iterator();
		while(it.hasNext())
		{
			Student stu = it.next();
			System.out.println(stu.getName()+"......"+stu.getAge());
		}
			
	}
}

class Student  implements Comparable<Student>//該接口強制讓學生具備比較性。
{
	private String name;
	private int age;
	Student(String name,int age)
	{
		this.setName(name);
		this.setAge(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 o) {
		if(this.age>o.age)
		return 1;
		else if(this.age==o.age)
			return this.name.compareTo(o.getName());
		else
			return -1;
	}
	
}

           

TreeSet底層資料結構:

紅黑樹,二叉樹。自動取則中值。

取值:

從最左邊開始取。每個一個節點的左邊必小于右邊。

黑馬程式員——集合架構(TreeSet)

如果将自定義對象的compareTo方法複寫成:

public int compareTo(Object obj)

return 1;

則TreeSet裡面存自定義對象時,都認為存入的下一個值比上一個值大,都存在二叉樹的右邊。

在擷取該TreeSet裡面的資料時,會将存入的先後值依次列印出,也就是怎麼存入怎麼取出。

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



/*
 * 當元素自身不具備比較性,或者具備的比較性不是所需要的。
 * 這時需要讓容器自身具備比較性。
 * 定義了比較器,将比較器對象作為參數傳遞給TreeSet集合的構造函數。
 * 
 * 當兩種排序都存在時,以比較器為主。
 * 
 * 定義一個類,實作Comparator接口,覆寫compare方法。
 * 
 * 
 */
public class TreeSetDemo2 {

	public static void main(String[] args) {
		
		Comparator<Student> com= new Comparator<Student>(){
             			//這個類本身就繼承了equals方法,是以可以不覆寫equals方法。
			@Override
			public int compare(Student s1, Student s2) {
				// TODO 自動生成的方法存根
				if(s1.getName().compareTo(s2.getName())!=0)
				{
					return s1.getName().compareTo(s2.getName());
				}
				else if(s1.getAge()>s2.getAge())
				{
					return 1;
				}
				else if(s1.getAge()<s2.getAge())
				{
					return -1;
				}
				else
				{
					return 0;
				}
			}
			//return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge());
		};
		
		
TreeSet<Student> ts = new TreeSet<Student>(com);
		
		ts.add(new Student("lisi01",18));
		ts.add(new Student("lisi02",19));
		ts.add(new Student("lisi04",18));
		ts.add(new Student("lisi001",19));
		
		Iterator<Student> it = ts.iterator();
		while(it.hasNext())
		{
			Student stu = it.next();
			System.out.println(stu.getName()+"......"+stu.getAge());
		}

	}

}


class Student  implements Comparable<Student>//該接口強制讓學生具備比較性。
{
	private String name;
	private int age;
	Student(String name,int age)
	{
		this.setName(name);
		this.setAge(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 o) {
		if(this.age>o.age)
		return 1;
		else if(this.age==o.age)
			return this.name.compareTo(o.getName());
		else
			return -1;
	}
	
}
           

練習: 按照字元串長度排序

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


public class TreeSetTest {

	public static void main(String[] args) {
		
		//自定義比較方式。
		Comparator<String> mycomp = new Comparator<String>(){

			@Override
			public int compare(String s1, String s2) {
				int num = new Integer(s1.length()).compareTo(s2.length());
				if(num == 0)
					return s1.compareTo(s2);
				return num;
			}
		};
		TreeSet<String> ts = new TreeSet<String>(mycomp);
		
		ts.add("abcd");
		ts.add("ccc");
		ts.add("cba");
		ts.add("z");
		ts.add("hahaha");
		
		Iterator<String> it = ts.iterator();
		while(it.hasNext())
		{
			System.out.println(it.next());
		}
		
	}

}