是否可以为值类使用两个compareTo方法?

时间:2014-02-06 19:52:16

标签: java sorting collections comparable

快速示例是用户名和姓的集合。

一种方法要求我使用名字进行比较,使用姓氏进行比较。是否可以有两个不同的compareTo()?

或者我最好创建两个不同的值类?

3 个答案:

答案 0 :(得分:5)

您可以在java中使用Comparator

在这个例子中,我使用Comparable比较FruitName使用Comparable CompareTo方法和数量基于fruitName,如果你想使用fruitDesc比较这个对象,那么就像我为fruitName做的那样创建一个更多的静态内部类/ p>

public class Fruit implements Comparable<Fruit>{

    private String fruitName;
    private String fruitDesc;
    private int quantity;

    public Fruit(String fruitName, String fruitDesc, int quantity) {
        super();
        this.fruitName = fruitName;
        this.fruitDesc = fruitDesc;
        this.quantity = quantity;
    }

    public String getFruitName() {
        return fruitName;
    }
    public void setFruitName(String fruitName) {
        this.fruitName = fruitName;
    }
    public String getFruitDesc() {
        return fruitDesc;
    }
    public void setFruitDesc(String fruitDesc) {
        this.fruitDesc = fruitDesc;
    }
    public int getQuantity() {
        return quantity;
    }
    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    public int compareTo(Fruit compareFruit) {

        int compareQuantity = ((Fruit) compareFruit).getQuantity(); 

        //ascending order
        return this.quantity - compareQuantity;

        //descending order
        //return compareQuantity - this.quantity;

    }

    public static Comparator<Fruit> FruitNameComparator 
                          = new Comparator<Fruit>() {

        public int compare(Fruit fruit1, Fruit fruit2) {

          String fruitName1 = fruit1.getFruitName().toUpperCase();
          String fruitName2 = fruit2.getFruitName().toUpperCase();

          //ascending order
          return fruitName1.compareTo(fruitName2);

          //descending order
          //return fruitName2.compareTo(fruitName1);
        }

    };
}

答案 1 :(得分:3)

不,你不能,但你可以为每个订单创建一个单独的Comparator

答案 2 :(得分:3)

使用compareTo表示您使用的是Comparable界面,该界面只为您的班级定义了一个“自然顺序”。

要进行任何其他排序,最好创建一个单独的类,为您需要的每个排序实现Comparator。您不需要创建不同的值类。

相关问题