# Comparable 接口

有一个商品类 Goods, 内含两个私有成员变量 name 和 price。我们需要对商品按照价格进行降序排序。

可以让Goods 类实现Comparable 接口, 重写 compareTo 方法。

comparaTo 返回负数, 如果当前对象价格比另一个对象贵，返回0说明价格相等。返回正数，说明当前对象价格比另一个对象便宜。

```java
public class Goods implements Comparable<Goods>{

    private String name;// 商品名称
    private double price;// 商品价格

    public Goods(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    // 对商品进行降序排序
    @Override
    public int compareTo(Goods g) {
        // 将当前对象与传入对象的成员属性进行比较
        // 返回负数若this.成员 < arg.成员, 返回0若相等, 返回正数若this.成员>arg.成员
        double price1 = this.getPrice();
        double price2 = g.getPrice();

        //因为是降序, 故取反
        int n = new Double(price2 - price1).intValue();
        return n;
    }

    @Override
    public String toString() {
        return "商品: " + name + ", 价格: " + price ;
    }

}
```

我们可以测试一下

用两个 Goods 对象 调用 compareTo 函数比较商品价格

还可以将 多个 Goods 对象放进集合里面, 然后调用Collections.sort 函数进行排序。

```java
public class GoodsTest {
    public static void main(String[] args) {

        Goods g1 =new Goods("手机",2000);
        Goods g2 =new Goods("自行车",1000);
        Goods g3 =new Goods("电脑",5000);

        if (g1.compareTo(g2)<0){
            System.out.println("手机比电脑贵");
        }

        List<Goods> goodsList= new ArrayList<>();
        goodsList.add(g1);
        goodsList.add(g2);
        goodsList.add(g3);

        // 对商品价格进行降序排序前,依次输出:手机，自行车，电脑
        System.out.println("对商品价格进行降序排序前 : ");
        for (Goods goods : goodsList) {
            System.out.println(goods);
        }

        System.out.println();

        // 对商品价格进行降序排序
        Collections.sort(goodsList);

        // 对商品价格进行降序排序后, 依次输出:电脑，手机，自行车
        System.out.println("对商品价格进行降序排序后 : ");
        for (Goods goods : goodsList) {
            System.out.println(goods);
        }

    }

}
```
