黑马程序员技术交流社区

标题: 关于TreeSet的使用方法、注意地方和实例 [打印本页]

作者: Без_тебя    时间: 2014-6-13 15:27
标题: 关于TreeSet的使用方法、注意地方和实例
TreeSet:数据元素可以排序且不能重复

对比:HashSet元素必须重写hashcode和equals方法


(1)TreeSet里面的元素是按照顺序排序的,那么就是说明,他的元素必须使用comparable接口的类,并且实现里面的compareTo方法,
不然两个元素怎么比较
new TreeSet();
(2)如果类不实现Comparable,还有一种,就是要做一个排序业务类,这个类要实现java.util.Comparator接口+compare方法,
new TreeSet(Comparator<? extends Comparator> comparator)


注意:在添加数据时排序,数据更改,不会影响原来的顺序,所以很有可能会造成重复,所以在用TreeSet的时候,不要修改数据,可能
会造成重复(可以用final来修饰)




我们在这边写了一个实例,是用来比较一个新闻类NewItem的排序,按照时间、点击量、标题名来先后来排序的,用到了一个比较类MyComarator(只能比较NewItem自己或子类),Demo是实现,让大家来参考参考

import java.util.Date;
import java.util.TreeSet;

public class Demo4 {
        public static void main(String[] args) {
                NewItem newItem1 = new NewItem("火星撞地球",100,new Date());
                NewItem newItem2 = new NewItem("月全食",10,new Date(System.currentTimeMillis()-500000));
                NewItem newItem3 = new NewItem("太阳风暴",20,new Date());
               
                MyComparator<NewItem> com = new MyComparator<NewItem>();
                TreeSet<NewItem> treeSet = new TreeSet<NewItem>(com);
               
                treeSet.add(newItem1);
                treeSet.add(newItem2);
                treeSet.add(newItem3);
               
                for(NewItem item : treeSet){
                        System.out.println(item);
                }
        }
}


import java.util.Comparator;

class MyComparator<T extends NewItem> implements Comparator<T>{

        @Override
        public int compare(T o1, T o2) {
                int result = -(o1.getDate().compareTo(o2.getDate()));
                if(result==0){
                        result = -(o1.getActive()-o2.getActive());
                        if(result==0){
                                result = o1.getName().compareTo(o2.getName());
                        }
                }
                return result;
        }

}


package demo4TreeSet;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

class NewItem {
        private final String name;//新闻名
        private final int active;//点击量
        private final Date date;//发布时间
        public NewItem(String name,int active,Date date){
                this.name=name;
                this.active=active;
                this.date=date;
        }
        public String getName() {
                return name;
        }
        public int getActive() {
                return active;
        }
        public Date getDate() {
                return date;
        }
        @Override
        public String toString() {
                DateFormat df = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
                String time = df.format(this.date);
                return "新闻标题:"+this.name+"  点击量:"+this.active+"  发表时间:"+time;
        }
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2