-----------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底層資料結構:
紅黑樹,二叉樹。自動取則中值。
取值:
從最左邊開始取。每個一個節點的左邊必小于右邊。
如果将自定義對象的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());
}
}
}