黑马程序员_TreeSet 学习总结

来源:互联网 发布:miss淘宝店外设店网址 编辑:程序博客网 时间:2024/05/07 16:52

------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));//与元素“第四个”重复数字比较nameset.add(new TreeSetTest("第二个",2));set.add(new TreeSetTest("第三个",3));set.add(new TreeSetTest("第四个",1));//与元素“第一个”重复数字比较nameset.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) {//使用比较器TsComparatorTreeSet set=new TreeSet(new TsComparator());System.out.println("使用比较器\n元素比较:");set.add(new TreeSetComparator("第一个",1));//与元素“第四个”重复数字比较nameset.add(new TreeSetComparator("第二个",2));set.add(new TreeSetComparator("第三个",3));set.add(new TreeSetComparator("第四个",1));//与元素“第一个”重复数字比较nameset.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;}}

运行结果:





0 0
原创粉丝点击