0

オブジェクトArrayListをソートするための次の行を含む基本クラスがあります。

Collections.sort(objects, SortObjectList);

また、並べ替えを定義する次のクラス定義も含まれています。

private class SortObjectList implements Comparator<T>
{
    public int compare(T lhs, T rhs) 
    {
        return lhs.name.compareToIgnoreCase(rhs.name);
    }
}

派生クラスがさまざまな基準を使用してソートできるようにするために、次を実装しました。

Collections.sort(objects, getSortObjectClass());

public Comparator<T> getSortObjectClass() {
    return new SortObjectList();
}
private class SortObjectList implements Comparator<T>
{
    public int compare(T lhs, T rhs) 
    {
        return lhs.name.compareToIgnoreCase(rhs.name);
    }
}

次に、次のように派生クラスで並べ替えをオーバーライドします。

@Override
public Comparator<MyDataClass> getSortObjectClass() {
    return new SortObjectList();
}
private class SortObjectList implements Comparator<MyDataClass>
{
    public int compare(MyDataClasslhs, MyDataClassrhs) 
    {
        return lhs.seqNo - rhs.seqNo;
    }
}

名前ではなく seqNo で注文します。

動作しますが、少しぎこちないようです。よりエレガントなソリューションを知っている人はいますか?

4

1 に答える 1

4

匿名の内部クラスを使用して、もう少しコンパクトすることができます。

@Override
public Comparator<MyDataClass> getSortObjectClass() {
    return new Comparator<MyDataClass> {
        @Override
        public int compare(MyDataClass lhs, MyDataClass rhs)  {
            return lhs.seqNo - rhs.seqNo;
        }
    };
}

しかし、これは Java と同じくらいコンパクトです。

(ちなみに、上記の比較では、オーバーフロー時に間違った結果が得られることに注意してください。)

于 2012-08-01T07:14:45.513 に答える