Java Comparable,compareTo()方法的多个/不同实现

时间:2011-07-17 01:12:39

标签: java overloading compareto

我有这堂课:

public class Sample implements Comparable<Sample> {
public String a;
public String b;
public String c;

public int compareTo (Sample sampleToCompare) {
int compResult = this.a.compareTo(sampleToCompare.a);
      return (compResult != 0 ? compResult : 
                   this.b.compareTo(sampleToCompare.b));    
    }
}

我希望compareTo()使用不同的类属性来表现或排序,具体取决于是否设置了标志。

所以,如果flag == 1我希望compareTo()使用属性c,否则为flag == 0,无论当前方法是什么。

换句话说,以不同的方式对同一个类进行排序。

我不知道如何实现这一目标。请帮忙。

另外,如果我需要更多信息,请告诉我。

3 个答案:

答案 0 :(得分:4)

如果要实现不同类型的排序,您应该查看java.util.Comparator界面。

public class SampleComparatorA implement Comparator<Sample> {

    public int compare(Sample a, Sample b) {
        // Your sorting
    }
}

并使用java.util.Collections.sort()方法将比较器作为secound参数。

Collections.sort(aSampleList, new SampleComparatorA());

答案 1 :(得分:3)

怎么样:

public int compareTo(Sample sampleToCompare) {
    if (flag == 1) {
        return this.c.compareTo(sampleToCompare.c);
    }
    if (flag == 0) {
        // current stuff
    }
    ...
}

但这并不是一种非常面向对象的方式。可能你应该有两个不同的比较器,并根据你的“标志”值选择它们。类似的东西:

class Sample {
    private String a;
    private String b;
    private String c;
}

class ASampleComparator implements Comparator<Sample> {
    public int compare(Sample o1, Sample o2) {
        return o1.a.compareTo(o2.a);
    }
}

class BSampleComparator implements Comparator<Sample> {
    public int compare(Sample o1, Sample o2) {
        return o1.b.compareTo(o2.b);
    }
}

class CSampleComparator implements Comparator<Sample> {
    public int compare(Sample o1, Sample o2) {
        return o1.c.compareTo(o2.c);
    }
}

public Comparator<Sample> pickComparator(int flag) {
    switch (flag) {
        case 0:
            return new ASampleComparator();
        case 1:
            return new BSampleComparator();
        case 2:
            return new CSampleComparator();
        default:
            throw new IllegalArgumentException("Bad flag value: " + flag);
    }
}

答案 2 :(得分:1)

你应该让你的标志保持静态,这样比较就会保持一致(如Effective Java, item 12中所述),否则你可能会a.compareTo(b)返回a > b,但b.compareTo(a) }返回b > a。所以我能想到的最简单的实现是:

public class Sample implements Comparable<Sample> {
public String a;
public String b;
public String c;
public static boolean my_flag = false;

public int compareTo (Sample sampleToCompare) {
    if (flag) {
        return this.c.compareTo(sampleToCompare.c);
    }
    int compResult = this.a.compareTo(sampleToCompare.a);
      return (compResult != 0 ? compResult : 
                   this.b.compareTo(sampleToCompare.b));    
    }
}