【问题标题】:Implementing comparator multiple times in a single class file [duplicate]在单个类文件中多次实现比较器[重复]
【发布时间】:2012-04-25 05:41:36
【问题描述】:

我有一些代码可以按修改日期对路径进行排序。我还想编写一些代码来以相反的顺序对路径进行排序,并且以后可能想要添加一些其他排序方法。有没有办法从单个类文件中进行所有排序?还是我必须创建另一个类 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;
}    

【问题讨论】:

    标签: java comparator


    【解决方案1】:

    为什么不选择匿名内部类?

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

    【讨论】:

    • 您可以获取更多信息here
    【解决方案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;
        }
    }}
    

    【讨论】:

      【解决方案3】:

      你不需要制作反向比较器,只需制作它并用它反转它

      Collections.reverseOrder()
      

      【讨论】:

      • 谢谢,我想到了,不过以后可能还想添加其他的排序方式,基本上是想更好地理解它是如何工作的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 2019-06-13
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      • 2021-12-09
      • 2012-11-03
      相关资源
      最近更新 更多