内外部比较器使用:
内部比较器:需比较的类实现接口 Comparable,使该类对外提供一个默认比较的实现
public class Test {
public static void main (String[] args) {
TreeSet<Worker> set = new TreeSet<Worker>();
set.add(new Worker("zhang3" , 18 ));
set.add(new Worker("li4" , 25 ));
set.add(new Worker("wang5" , 22 ));
set.add(new Worker("lao6" , 22 ));
set.add(new Worker("xiaoming" , 22 ));
Iterator<Worker> iterator = set.iterator();
while (iterator.hasNext()) {
Worker worker = iterator.next();
System.out.println(worker);
}
}
}
public class Worker implements Comparable <Worker > {
private String name;
private int age;
public Worker (String name, int age) {
super ();
this .name = name;
this .age = age;
}
@Override
public int compareTo (Worker w) {
int sub = this .age - w.age;
if (sub == 0 )
return this .name.compareTo(w.name);
else
return sub;
}
public String getName () {
return name;
}
public int getAge () {
return age;
}
@Override
public String toString () {
return "Worker [name=" + name + ", age=" + age + "]" ;
}
}
外部比较器:需比较的类不做任何实现,该类通过工具类Collections调用sort方法传入一个实现了接口 Comparator的类和一个List
public class Test {
public static void main (String[] args) {
List<Worker> list = new ArrayList<Worker>();
list.add(new Worker("zhang3" , 18 ));
list.add(new Worker("li4" , 25 ));
list.add(new Worker("wang5" , 22 ));
list.add(new Worker("lao6" , 22 ));
list.add(new Worker("xiaoming" , 22 ));
Collections.sort(list, new MyComparator());
for (int i = 0 ; i < list.size(); i++) {
Worker worker = list.get(i);
System.out.println(worker);
}
}
}
public class Worker {
private String name;
private int age;
public Worker (String name, int age) {
super ();
this .name = name;
this .age = age;
}
public String getName () {
return name;
}
public int getAge () {
return age;
}
@Override
public String toString () {
return "Worker [name=" + name + ", age=" + age + "]" ;
}
}
public class MyComparator implements Comparator <Worker > {
@Override
public int compare (Worker o1, Worker o2) {
int sub = o1.getAge() - o2.getAge();
if (sub == 0 )
return o1.getName().compareTo(o2.getName());
else
return sub;
}
}
总结:
TreeSet仅能根据创建时实现的comparable接口(内部比较器)进行排序,且HashSet不支持内部比较器,工具类Collections.sort()方法仅能对List排序。 TreeSet—使用— 内部比较器 List—使用—外部比较器 在一个类没有提供比较器时或提供的比较器不适用时,就需要使用外部比较器(例如:拿到一个jar包但它的类没比较器,总不能反编译去改代码)