Реализация компаратора несколько раз в одном файле класса

У меня есть код для сортировки путей по дате изменения. Я также хочу написать код для сортировки путей в обратном порядке, а позже, возможно, захочу добавить некоторые другие методы сортировки. Есть ли способ сделать всю сортировку из одного файла класса? Или мне нужно создать еще один класс 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;
}    

person localhost    schedule 25.04.2012    source источник


Ответы (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
      }
    };
person Shashank Kadne    schedule 25.04.2012
comment
Вы можете получить дополнительную информацию здесь - person Shashank Kadne; 25.04.2012

Обычно я поступал так. Обратите внимание, что конструктор является «приватным», и для получения экземпляра существует «общедоступный фабричный метод». В любой точке всегда будет два экземпляра 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;
    }
}}
person ZeX    schedule 25.04.2012

вам не нужно делать обратный компаратор, просто сделайте его и переверните с помощью

Collections.reverseOrder()
person Peter    schedule 25.04.2012
comment
Спасибо, я думал об этом, но я, вероятно, хочу добавить другие методы сортировки позже, и в основном хочу лучше понять, как все это работает. - person localhost; 25.04.2012