在java中实现对象排序的方式有两种:

  • 自然排序:java.lang.Comparable
  • 定制排序:java.util.Comparator

1. 自然排序:java.lang.Comparable

Comparable是直接加在类上面的,需要实现Comparable接口,并且重写compareTo(Object obj)方法,规则是:

  • 如果this>obj,则返回正整数;
  • 如果this<obj,则返回负整数;
  • 如果this=obj,则返回0.

实现Comparable接口的对象列表(和数组)可以通过 Collections.sort 或 Arrays.sort进行自动排序。实现此接口的对象可以用作有序映射中的键或有 序集合中的元素,无需指定比较器。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.util.Arrays;

class Goods implements Comparable<Goods> {
    private String name;
    private double price;

    @Override
    public int compareTo(Goods o) {
        if (this.price > o.price) {
            return 1;
        } else if (this.price < o.price) {
            return -1;
        }
        return 0;
    }
   //构造器、getter、setter、toString()方法略
}


public class ComparableTest {
    public static void main(String[] args) {
        Goods[] goods = new Goods[2];
        goods[0] = new Goods("钢笔", 13.5);
        goods[1] = new Goods("铅笔", 2.5);
        Arrays.sort(goods);
        // [Goods{name='铅笔', price=2.5}, Goods{name='钢笔', price=13.5}]
        System.out.println(Arrays.toString(goods));
    }
}

2. 定制排序:java.util.Comparator

当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码, 或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用 Comparator 的对象来排序,强行对多个对象进行整体排 序的比较。

重写compare(Object o1, Object o2)方法,比较o1和o2的大小:

  • 如果o1>o2,则返回正整数;
  • 如果o1<o2,则返回负整数;
  • 如果o1=o2,则返回0。

可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort), 从而允许在排序顺序上实现精确控制。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
Goods[] goods = new Goods[4];
goods[0] = new Goods("钢笔", 13.5);
goods[1] = new Goods("铅笔", 2.5);
goods[2] = new Goods("铅笔B", 1.5);
goods[3] = new Goods("毛笔", 8);
//创建Comparator的匿名实例
Arrays.sort(goods, new Comparator<Goods>() {
    @Override
    public int compare(Goods o1, Goods o2) {
        return -Double.compare(o1.getPrice(), o2.getPrice());
    }
});
//[Goods{name='钢笔', price=13.5}, Goods{name='毛笔', price=8.0}, Goods{name='铅笔', price=2.5}, Goods{name='铅笔B', price=1.5}]
System.out.println(Arrays.toString(goods));