Comparable接口实现和使用方法

1.什么是Comparable接口

此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)可以通过 Collections.sort (和 Arrays.sort )进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。 强烈推荐(虽然不是必需的)使自然排序与 equals 一致。所谓与equals一致是指对于类 的每一个 e1 和 e2 来说,当且仅当(e1.compareTo((Object)e2) == 0) e1.equals((Object)e2) 具有相同的布尔值时,类 的自然排序才叫做与 equals 一致 。

Java代码   收藏代码
  1. import java.util.ArrayList;  
  2. import java.util.Collections;  
  3. import java.util.List;  
  4. public class Book implements Comparable{  
  5. /*编写一个类Book,具有name,price,press,author属性.然后创建5个对象放入ArrayList中,并实现按照price大小排序(使用Comparable接口排序), 
  6.    然后遍历ArrayList输出每个Book对象。*/  
  7. private String name;  
  8. private float price;  
  9. private String press;  
  10. private String author;  
  11.   
  12. //构造方法  
  13. public Book(String name,float price,String press,String author){  
  14.    this.name = name;  
  15.    this.price = price;  
  16.    this.press = press;  
  17.    this.author = author;  
  18.    System.out.println(name.toString());  
  19. }  
  20. @SuppressWarnings("unchecked")  
  21. public static void main(String[] args){  
  22.    List<Book> list = new ArrayList<Book>();  
  23.    Book b1=new Book("java1",25f,"不错的书","LY1");  
  24.    Book b2=new Book("java2",26f,"不错的书","LY2");  
  25.    Book b3=new Book("java3",50f,"不错的书","LY3");  
  26.    Book b4=new Book("java4",20f,"不错的书","LY4");  
  27.    Book b5=new Book("java5",15f,"不错的书","LY5");  
  28.    list.add(b1);  
  29.    list.add(b2);  
  30.    list.add(b3);  
  31.    list.add(b4);  
  32.    list.add(b5);  
  33.    Collections.sort(list);  
  34.    for(int i=0;i<list.size();i++){  
  35.     Book book = (Book)list.get(i);  
  36.     System.out.println(book);  
  37.    }  
  38. }  
  39.    //重写  
  40. public int compareTo(Object obj) {  
  41.       Book p = (Book)obj;  
  42.       if(p.price>this.price){  
  43.      return 1;  
  44.       }  
  45.       else if(p.price<this.price){  
  46.      return -1;  
  47.       }  
  48.       else{  
  49.           return 0;  
  50.       }  
  51. }  
  52. //重写toString方法  
  53. public String toString(){//这上是重写了本类的toString方法,对系统自带的其它字段的toString方法无效  
  54.      return "书名:"+this.name+", 价格:"+this.price+", 说明:"+this.press+", 作者: "+this.author;  
  55.      }  
  56. }  
  57. //.sort(List)方法,当然还可能使用java.util.Arrays.sort(数组),那样就必须把//list转化为数组,由于本例使用Collections.sort(List)已经足够,另一方法,大家可//以尝试自已使用.  

2.与Comparator的区别

Comparator位于包java.util下,而Comparable位于包java.lang下,Comparable接口将比较代码嵌入自身类中,而后者在一个独立的类中实现比较。 如果类的设计师没有考虑到Compare的问题而没有实现Comparable接口,可以通过 Comparator来实现比较算法进行排序,并且为了使用不同的排序标准做准备,比如:升序、降序。

我们看一个Comparator的例子:

import java.util.TreeSet; 
import java.util.Comparator; 
class NumComparator implements Comparator<NameTag> { 
public int compare (NameTag left,NameTag right) { 
return(left.getNumber() - right.getNumber()); 


public class CollectionNine { 
public static void main(String arg[]) { 
new CollectionNine(); 

CollectionNine() { 
NumComparator comparator = new NumComparator(); 
TreeSet<NameTag> set = new TreeSet<NameTag>(comparator); 
set.add(new NameTag("Agamemnon",300)); 
set.add(new NameTag("Cato",400)); 
set.add(new NameTag("Plato",100)); 
set.add(new NameTag("Zeno",200)); 
set.add(new NameTag("Archimedes",500)); 
for(NameTag tag : set) 
System.out.println(tag); 

}

 

 

猜你喜欢

转载自windpoplar.iteye.com/blog/2315973