无涯教程-Java - Comparator 比较器函数

37 阅读1分钟

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相同。

参考链接

www.learnfk.com/java/java-u…