String类中有自己的比较方法,但是它们的比较是按照字符串的字典顺序比较的,我们想自定义比较方法时,java给我们提供了比较器。
通过查api得知TreeSet类有一个构造方法,他接收的是comparator接口。那么当创建TreeSet类的时候,我们可以给它传一个实现comparator接口的类,然后自定义比较方法。
查api得知comparator接口中有compare,equals两个方法。
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
class BiJIaoQi implements Comparator {
@Override
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
if(! (o1 instanceof String&&o2 instanceof String)){ throw new ClassCastException("你的类型有误");
}
String s1=(String)o1;
String s2=(String)o2;
return s1.length()-s2.length();
}
}
public class TreeSetDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeSet ts=new TreeSet(new BiJIaoQi());
ts.add("aaaaaaaaaa");
ts.add("aaaaaa");
ts.add("aaaa");
ts.add("aa");
for (Iterator iterator = ts.iterator(); iterator.hasNext();) {
System.out.println(iterator.next());
}
}
}
comparable通过返回的值来进行存放,当返回的值为0时集合不保存,当返回的值为负数,正数时来确定存放的位置。
当我们使用compare方法时想进行长度的比较时,需要调用length方法,所以需要向下转型。