TreeSet和TreeMap都按排序顺序存储元素。但是,比较器(Comparator)精确地定义了排序顺序的含义。
比较器(Comparator)接口定义了两个方法:compare()和equals()。
Compare方法
int compare(Object obj1,Object obj2)
obj1和obj2是要比较的对象。如果对象相等,则此方法返回零。如果obj1大于obj2,则返回正值。否则,将返回负值。
Equals方法
此处显示的equals()方法测试对象是否等于调用比较器-
boolean equals(Object obj)
obj是要测试是否相等的对象。如果obj和调用对象都是Comparator对象,并且使用相同的顺序,则该方法返回true。否则,它返回false。
Comparator示例
import java.util.*;
class Dog implements Comparator<Dog>, Comparable<Dog> {
private String name;
private int age;
Dog() {
}
Dog(String n, int a) {
name=n;
age=a;
}
public String getDogName() {
return name;
}
public int getDogAge() {
return age;
}
//覆盖 compareTo 方法
public int compareTo(Dog d) {
return (this.name).compareTo(d.name);
}
//覆盖比较方法对年龄进行排序
public int compare(Dog d, Dog d1) {
return d.age - d1.age;
}
}
public class Example {
public static void main(String args[]) {
//获取一个 Dog 对象列表
List<Dog> list=new ArrayList<Dog>();
list</span><span class="pun">.</span><span class="kwd">add</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Dog</span><span class="pun">(</span><span class="str">"Shaggy"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">));</span><span class="pln">
list</span><span class="pun">.</span><span class="kwd">add</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Dog</span><span class="pun">(</span><span class="str">"Lacy"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">));</span><span class="pln">
list</span><span class="pun">.</span><span class="kwd">add</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Dog</span><span class="pun">(</span><span class="str">"Roger"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10</span><span class="pun">));</span><span class="pln">
list</span><span class="pun">.</span><span class="kwd">add</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Dog</span><span class="pun">(</span><span class="str">"Tommy"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">));</span><span class="pln">
list</span><span class="pun">.</span><span class="kwd">add</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Dog</span><span class="pun">(</span><span class="str">"Tammy"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">));</span><span class="pln">
</span><span class="typ">Collections</span><span class="pun">.</span><span class="pln">sort</span><span class="pun">(</span><span class="pln">list</span><span class="pun">);</span><span class="pln"> </span><span class="com">//对数组列表进行排序</span><span class="pln">
</span><span class="kwd">for</span><span class="pun">(</span><span class="typ">Dog</span><span class="pln"> a</span><span class="pun">:</span><span class="pln"> list</span><span class="pun">)</span><span class="pln"> </span><span class="com">//打印名称的排序列表</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">a</span><span class="pun">.</span><span class="pln">getDogName</span><span class="pun">()</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">", "</span><span class="pun">);</span><span class="pln">
</span><span class="com">//使用比较器对数组列表进行排序</span><span class="pln">
</span><span class="typ">Collections</span><span class="pun">.</span><span class="pln">sort</span><span class="pun">(</span><span class="pln">list</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Dog</span><span class="pun">());</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">" "</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">for</span><span class="pun">(</span><span class="typ">Dog</span><span class="pln"> a</span><span class="pun">:</span><span class="pln"> list</span><span class="pun">)</span><span class="pln"> </span><span class="com">//打印年龄的排序列表</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">a</span><span class="pun">.</span><span class="pln">getDogName</span><span class="pun">()</span><span class="pln"> </span><span class="pun">+</span><span class="str">" : "</span><span class="pun">+</span><span class="pln"> a</span><span class="pun">.</span><span class="pln">getDogAge</span><span class="pun">()</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">", "</span><span class="pun">);</span><span class="pln">
}
}
这将产生以下输出-
Lacy, Roger, Shaggy, Tammy, Tommy, Tammy : 1, Lacy : 2, Shaggy : 3, Tommy : 4, Roger : 10,
注意-Arrays类的排序与Collections相同。