2

我有这堂课:

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()使用 property c,否则就是flag == 0方法中当前的任何内容。

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

我不确定如何实现这一目标。请帮忙。

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

4

3 回答 3

4

如果你想实现不同类型的排序,你应该看看java.util.Comparator接口。

public class SampleComparatorA implement Comparator<Sample> {

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

并使用java.util.Collections.sort()方法将 Comparator 作为第二个参数。

Collections.sort(aSampleList, new SampleComparatorA());
于 2011-07-17T01:41:05.300 回答
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);
    }
}
于 2011-07-17T01:23:26.037 回答
1

您应该将标志设为静态,以便比较一致(如Effective Java,第 12 项中所述),否则,您可能会得到 thata.compareTo(b)返回 that a > b,但b.compareTo(a)返回 that 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));    
    }
}
于 2011-07-17T01:23:10.317 回答