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;
}
}
|
|