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()cflag == 0

つまり、同じクラスを異なる方法でソートします。

これを達成する方法がわかりません。助けてください。

また、私の側からさらに情報が必要な場合はお知らせください。

4

3 に答える 3

4

If you want to implement different kind of sorting, you should take a look at java.util.Comparator interface.

public class SampleComparatorA implement Comparator<Sample> {

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

And use java.util.Collections.sort() method with the Comparator as the secound parameter instead.

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
    }
    ...
}

ただし、これはあまりオブジェクト指向の方法ではありません。おそらく、2 つの異なるコンパレーターと、「フラグ」値に基づいてそれらを選択する方法が必要です。何かのようなもの:

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

比較が一貫するように、フラグを static にする必要があります (有効な Java の項目 12 で説明されているように) 。したがって、私が考えることができる最も単純な実装は次のとおりです。a.compareTo(b)a > bb.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));    
    }
}
于 2011-07-17T01:23:10.317 に答える