1.什么是Comparable接口
此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)可以通过 Collections.sort (和 Arrays.sort )进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。 强烈推荐(虽然不是必需的)使自然排序与 equals 一致。所谓与equals一致是指对于类 C 的每一个 e1 和 e2 来说,当且仅当(e1.compareTo((Object)e2) == 0) 与e1.equals((Object)e2) 具有相同的布尔值时,类 C 的自然排序才叫做与 equals 一致 。
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
- public class Book implements Comparable{
- /*编写一个类Book,具有name,price,press,author属性.然后创建5个对象放入ArrayList中,并实现按照price大小排序(使用Comparable接口排序),
- 然后遍历ArrayList输出每个Book对象。*/
- private String name;
- private float price;
- private String press;
- private String author;
- //构造方法
- public Book(String name,float price,String press,String author){
- this.name = name;
- this.price = price;
- this.press = press;
- this.author = author;
- System.out.println(name.toString());
- }
- @SuppressWarnings("unchecked")
- public static void main(String[] args){
- List<Book> list = new ArrayList<Book>();
- Book b1=new Book("java1",25f,"不错的书","LY1");
- Book b2=new Book("java2",26f,"不错的书","LY2");
- Book b3=new Book("java3",50f,"不错的书","LY3");
- Book b4=new Book("java4",20f,"不错的书","LY4");
- Book b5=new Book("java5",15f,"不错的书","LY5");
- list.add(b1);
- list.add(b2);
- list.add(b3);
- list.add(b4);
- list.add(b5);
- Collections.sort(list);
- for(int i=0;i<list.size();i++){
- Book book = (Book)list.get(i);
- System.out.println(book);
- }
- }
- //重写
- public int compareTo(Object obj) {
- Book p = (Book)obj;
- if(p.price>this.price){
- return 1;
- }
- else if(p.price<this.price){
- return -1;
- }
- else{
- return 0;
- }
- }
- //重写toString方法
- public String toString(){//这上是重写了本类的toString方法,对系统自带的其它字段的toString方法无效
- return "书名:"+this.name+", 价格:"+this.price+", 说明:"+this.press+", 作者: "+this.author;
- }
- }
- //.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);
}
}