通用比较器和类的可比较性

来源:互联网 发布:vm mac共享文件夹 编辑:程序博客网 时间:2024/06/07 14:27

定义通用比较器:

 

package chapter11.sub07;

import java.util.Comparator;

//定义的是比较器,所以这个需要传入进去的是两个参数
public class GenericComparator<T> implements Comparator<T>{

 //设置返回的值0代表相等,>0大于<0小于
 @Override
 public int compare(T o1, T o2) {
  if(o1.equals(o2)){
   return 0;
  }
  //把参数强制转换为Comparable类型再比较,这样的好处
  //在于,如果你使用的是这个比较器,并且你在调用的时候
  //传入的参数是实现了Comparable接口的类型的话,那么
  //在传入比较器的时候,它就会自动的去调用被比较的类型
  //里面所定义的compareTo方法
  return ((Comparable<T>)o1).compareTo(o2)*-1;
 }
}

 

定义可比较类型的类:

 

package chapter11.sub07;

public class Person implements Comparable<Person> {
 private String name;
 private int age;
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public int getAge() {
  return age;
 }
 public void setAge(int age) {
  this.age = age;
 }
 public Person(String name, int age) {
  super();
  this.name = name;
  this.age = age;
 }
 
 @Override
 public int compareTo(Person o) {
  //正整数代表的是大于
  //0代表的是相等
  //负整数代表小于
  return (this.age-o.getAge())*-1;
 }
 
}

 

 

测试通用比较器为TreeSet传入通用比较器:

 

package chapter11.sub07;

import java.util.Iterator;
import java.util.TreeSet;

public class TestTreeSet {
 public static void main(String[] args) {
  //默认的treeSet排序是按照字母的顺序排序
  TreeSet<String> fruits=new TreeSet<String>();
  fruits.add("orange");
  fruits.add("pear");
  fruits.add("banana");
  fruits.add("apple");
  
  Iterator<String> it=fruits.iterator();
  while(it.hasNext()) {
   System.out.println(it.next().toString());
  }
  
  //Person的排序
  TreeSet<Person> ps=new TreeSet<Person>(new GenericComparator<Person>());
  ps.add(new Person("dada", 24));
  ps.add(new Person("tongtong", 3));
  ps.add(new Person("hehe", 1));
  
  Iterator<Person> it1=ps.iterator();
  while(it1.hasNext()) {
   Person p=it1.next();
   System.out.println("姓名:"+p.getName()+"\t年龄:"+p.getAge());
  }
  
 }
}