------Java培训、Android培训、iOS培训、.Net培训期待与您交流! -------
一直没有真正用过TreeSet,这几天一直在研究,写下学习总结,以备不时之需!
1.TreeSet 实现了Set接口隶属于Collection接口。
2.Set 为无序存储,为弥补这一缺陷TreeSet为有序列排序,使用元素的自然顺序对元素进行排序。所存元素不可重复。
3.底层数据结构为哈希表,依靠TreeMap实现。
4.此实现不是同步的,如果多个线程访问一个TreeSet,其中至少一个线程修改了该set,那么它必须外部同步。一般是通过对自然封装该set的对象执行同步操作来完成。
如不存在这样的对象,则应该使用Collections.synchronizedSortedSet方法来“包装”该set。此操作最好是在创建时进行,以防止对set的意外非同步访问
SortedSet s=Collections.synchronizedSortedSet(new TreeSet(...));
5.两种排序方式:第一种实现Comparable接口,实现接口方法compareTo(Object obj) 。
第二种定义比较器实现Comparator接口,实现接口方法compare(Object obj1,Object obj2)。
建议使用比较器方式,1易扩展、2代码可读性、3复用性.
例:实现Comparable方式
import java.util.*;
class TreeSetTest implements Comparable
{
private String name;
private int code;
public TreeSetTest(String name,int code)
{
this.name=name;
this.code=code;
}
public static void main(String[] args)
{
TreeSet set=new TreeSet();
System.out.println("元素比较:");
set.add(new TreeSetTest("第一个",1));//与元素“第四个”重复数字比较name
set.add(new TreeSetTest("第二个",2));
set.add(new TreeSetTest("第三个",3));
set.add(new TreeSetTest("第四个",1));//与元素“第一个”重复数字比较name
set.add(new TreeSetTest("第五个",5));//重复元素
set.add(new TreeSetTest("第六个",4));
set.add(new TreeSetTest("第五个",5));//重复元素
//循环打印
Iterator iterator=set.iterator();
System.out.println("TreeSet元素序列:");
while(iterator.hasNext())
{
TreeSetTest treeSet=(TreeSetTest)iterator.next();
System.out.println(treeSet.name+"......"+treeSet.code);
}
}
//实现compareTo比较
public int compareTo(Object obj)
{
int returnInt=0;
if(obj instanceof TreeSetTest)
{
TreeSetTest treeSet=(TreeSetTest)obj;
System.out.print(this.name+"......compareTo......"+treeSet.name);
//三维运算、简单容易理解 先判断编号升序
returnInt=((this.code>treeSet.code)?1:((this.code<treeSet.code)?-1:0));
//在编号相同的情况下判断名称。
if(returnInt==0)
returnInt=this.name.compareTo(treeSet.name);
System.out.println(" 比较结果反回:"+returnInt);
}
return returnInt;
}
}
运行结果为:
使用比较器:
例:
import java.util.*;
class TreeSetComparator
{
private String name;
private int code;
public TreeSetComparator(String name,int code)
{
this.name=name;
this.code=code;
}
public String getName()
{
return this.name;
}
public int getCode()
{
return this.code;
}
public static void main(String[] args)
{
//使用比较器TsComparator
TreeSet set=new TreeSet(new TsComparator());
System.out.println("使用比较器\n元素比较:");
set.add(new TreeSetComparator("第一个",1));//与元素“第四个”重复数字比较name
set.add(new TreeSetComparator("第二个",2));
set.add(new TreeSetComparator("第三个",3));
set.add(new TreeSetComparator("第四个",1));//与元素“第一个”重复数字比较name
set.add(new TreeSetComparator("第五个",5));//重复元素
set.add(new TreeSetComparator("第六个",4));
set.add(new TreeSetComparator("第五个",5));//重复元素
//循环打印
Iterator iterator=set.iterator();
System.out.println("TreeSet元素序列:");
while(iterator.hasNext())
{
TreeSetComparator treeSet=(TreeSetComparator)iterator.next();
System.out.println(treeSet.name+"......"+treeSet.code);
}
}
}
class TsComparator implements Comparator
{
public int compare(Object obj,Object obj2)
{
int returnInt=0;
if(obj instanceof TreeSetComparator&&obj2 instanceof TreeSetComparator)
{
TreeSetComparator treeSet=(TreeSetComparator)obj;
TreeSetComparator treeSet2=(TreeSetComparator)obj2;
System.out.print(treeSet.getName()+"......compareTo......"+treeSet2.getName());
//三维运算、简单容易理解 先判断编号升序
returnInt=((treeSet.getCode()>treeSet2.getCode())?1:((treeSet.getCode()<treeSet2.getCode())?-1:0));
//在编号相同的情况下判断名称。
if(returnInt==0)
returnInt=treeSet.getName().compareTo(treeSet2.getName());
System.out.println(" 比较结果反回:"+returnInt);
}
return returnInt;
}
}
运行结果: