5

変更日でパスをソートするコードがいくつかあります。パスを逆順に並べ替えるコードも書きたいと思います。後で、他の並べ替え方法を追加したいと思うかもしれません。単一のクラス ファイルからすべての並べ替えを行う方法はありますか? または、別のクラス PathSortByDateReverse、PathSortByCreated、PathSortByFoo などを作成する必要がありますか。また、さまざまな並べ替え方法をどのように使用しますか?

import java.nio.file.Path;
import java.util.Comparator;

public class PathSortByDate implements Comparator<Path> {

@Override
public int compare(Path first, Path second) {
    long seconddate = second.toFile().lastModified(); // get just the filename
    long firstdate = first.toFile().lastModified();

    if (firstdate == seconddate) {
        return 0;
    } else if (firstdate > seconddate) {
        return 1;
    } else {
        return -1;
    }
}
}

次に、他のクラスから次のように呼び出します。

public static ArrayList<Path> sortArrayListByDate(ArrayList<Path> pathlist) {
    Collections.sort(pathlist,new PathSortByDate());
    return pathlist;
}    
4

3 に答える 3

3

匿名の内部クラスを使用しないのはなぜですか?

public static final Comparator<Person> ID_DESC
     = new Comparator<Person>() {
      public int compare(Person p1, Person p2) {
         return -1 * p1.getId().comparedTo(p2.getId());
         // reversed order
      }
    };
于 2012-04-25T05:50:58.183 に答える
2

私は通常、このようにします。コンストラクターは「プライベート」であり、インスタンスを取得するための「パブリック ファクトリ メソッド」があることに注意してください。任意の時点で 2 つの PathComparator インスタンスが存在します。コードを最適化し、ベスト プラクティスを使用する場合、これは大きな問題です。

import java.nio.file.Path;
import java.util.Comparator;

final public class PathComparator implements Comparator<Path> {

// comparator for in order
final private static PathComparator ascendingOrderComparatorDate = new PathComparator(true);
// comparator for reverse order
final private static PathComparator descendingOrderComparatorDate = new PathComparator(false);

final private int isAscendingOrderInt;

final public PathComparator getPathComparator(boolean isAscendingOrder) {
    return isAscendingOrder ? ascendingOrderComparatorDate : descendingOrderComparatorDate;
}

private PathComparator(boolean isAscendingOrder) {
    this.isAscendingOrderInt = isAscendingOrder ? 1 : -1;
}

@Override
public int compare(Path first, Path second) {
    // for optimization (not required but highly recommended)
    if(first == second) return 0;

    long seconddate = second.toFile().lastModified(); // get just the filename
    long firstdate = first.toFile().lastModified();

    if (firstdate == seconddate) {
        return 0;
    } else if (firstdate > seconddate) {
        return isAscendingOrderInt * 1;
    } else {
        return isAscendingOrderInt * -1;
    }
}}
于 2012-04-25T06:18:44.987 に答える
1

逆コンパレータを作成する必要はありません。作成して逆にするだけです

Collections.reverseOrder()
于 2012-04-25T05:44:54.433 に答える