TreeSet:
可以对Set集合中的元素进行排序。
---排序时,当主要条件相同时,一定要判断次要条件。
---底层数据结构是二叉树。
---保证元素唯一性的依据:compareTo方法 return 0;
1. TreeSet排序的第一种方式:让元素自身具备比较性
需实现comparable接口,覆盖compareTo方法,亦即元素的自然顺序。
程序示例:
import java.util.*;
classFamilyMember implements Comparable//实现该接口,让对象具备可比性
{
privateString name;
privateint age;
FamilyMember(Stringname, int age)
{
this.name= name;
this.age= age;
}
publicint compareTo(Object obj)
{
/*
if(!(objinstanceof FamilyMember))
thrownew RuntimeException("对象类型错误");
FamilyMemberfamilym = (FamilyMember)obj;
if(this.age> familym.age)
return1;
if(this.age== familym.age)
{
returnthis.name.compareTo(familym.name);
}
return-1;
*/
return0;//返回 1是正序,返回 -1 是逆序,返回 0唯一元素
}
publicString getName()
{
returnname;
}
publicint getAge()
{
returnage;
}
}
publicclass TreeSetDemo
{
publicstatic void treeSet_Basic()
{
TreeSettreeSet = new TreeSet();
treeSet.add("ff");
treeSet.add("bb");
treeSet.add("hh");
for(Iteratoriter = treeSet.iterator(); iter.hasNext(); )
{
System.out.println("---->"+ iter.next());
}
}
public staticvoid treeSet_Advanced()
{
TreeSettreeSet = new TreeSet();
treeSet.add(newFamilyMember("hh", 22));
treeSet.add(newFamilyMember("bb", 1));
treeSet.add(newFamilyMember("bbmm", 22));
treeSet.add(newFamilyMember("bbbb", 23));
for(Iteratoriter = treeSet.iterator(); iter.hasNext(); )
{
FamilyMemberfm = (FamilyMember)iter.next();
System.out.println(fm.getName()+ "--->" + fm.getAge());
}
}
publicstatic void main(String[] args)
{
//treeSet_Basic();
treeSet_Advanced();
}
}
2. TreeSet排序的第二种方式:让容器具备比较性
当元素自身不具备比较性,或者具备的比较性不是我们所需要的
这时需要让容器自身具备比较性。
定义一个比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
方法:定义一个类(比较器),实现Comparator接口,覆盖compare方法
程序示例:
importjava.util.*;
classMyComparator implements Comparator//定义一个类实现比较器接口
{
public int compare(Object obj1, Objectobj2)
{
FamilyMember fm1 =(FamilyMember)obj1;
FamilyMember fm2 =(FamilyMember)obj2;
//比较处理一定要充分考虑程序的健壮性
int result =fm1.getName().compareTo(fm2.getName());//compareTo返回一个整数
if(0 == result)
{
if(fm1.getAge() >fm2.getAge())
return 1;
if(fm1.getAge() ==fm2.getAge())
return 0;
return -1;
}
return result;
}
}
classFamilyMember
{
private String name;
private int age;
FamilyMember(String name, int age)
{
this.name = name;
this.age = age;
}
/*
public int compareTo(Object obj)
{
if(!(obj instanceof FamilyMember))
throw newRuntimeException("对象类型错误");
FamilyMember familym =(FamilyMember)obj;
if(this.age > familym.age)
return 1;
if(this.age == familym.age)
{
returnthis.name.compareTo(familym.name);
}
return -1;
//自然顺序 return0;返回 1 是正序,返回 -1是逆序,返回 0 唯一元素
}
*/
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
public classTreeSetDemo2
{
public static void treeSet_Advanced()
{
TreeSet treeSet = newTreeSet(new MyComparator());
treeSet.add(newFamilyMember("hh", 22));
treeSet.add(newFamilyMember("bb", 1));
treeSet.add(newFamilyMember("bb", 1));
treeSet.add(newFamilyMember("bb", 2));
treeSet.add(newFamilyMember("bbmm", 22));
treeSet.add(newFamilyMember("bbbb", 23));
for(Iterator iter =treeSet.iterator(); iter.hasNext(); )
{
FamilyMember fm =(FamilyMember)iter.next();
System.out.println(fm.getName()+ "--->" + fm.getAge());
}
}
public static void main(String[] args)
{
treeSet_Advanced();
}
}
练习:按照字符串长度排序。
import java.util.*;
class StrComparator implements Comparator
{
publicint compare(Object o1, Object o2)
{
Strings1 = (String)o1;
Strings2 = (String)o2;
intresult = (new Integer(s1.length())).compareTo(new Integer(s2.length()));
if(0== result)
returns1.compareTo(s2);//比较字符串
returnresult;
}
}
public class TreeSetTest
{
publicstatic void strLenSort()
{
TreeSettreeSet = new TreeSet(new StrComparator());//易错!!不要漏掉!!!
treeSet.add("huanhuan");
treeSet.add("xiaoleng");
treeSet.add("fanfan");
treeSet.add("babybeibei");
for(Iteratoriter = treeSet.iterator(); iter.hasNext(); )
{
System.out.println(iter.next());
}
}
publicstatic void main(String[] args)
{
strLenSort();
}
}