java - Java Comparator接口(interface)的使用 - 对文件进行排序

标签 java generics comparator

我有一个程序可以对计算机某个目录中的文件进行排序。我正在使用比较器接口(interface)并使用 collections.sort-方法,但我无法从调用类访问输出。我也不知道如何对 Sort 类中的对象进行排序。

1)如果有人能告诉我如何使用比较方法,我会很高兴(原型(prototype)是:sort(List list, Comparator c)

2) 如何获取目录类中的输出?因为 Sort-class 是参数化的,所以我无法访问方法 public String getName()

创建 Sort 类对象并将其放入 Arraylist(Sort 成员)的 class Directory

 private Sort sort = new Sort();
 file = new File(System.getProperty(dir));
 File[] files = getFiles(); // return only files, not directories;

 for (int i = 0; i < files.length; i++) {
    sort.arrayList.add(new Sort(files[i])); // put those in an ArrayList belonging to sort
 }

list(sort); // call list-method



public void list(Comparator<File> sortOrder) {
    Collections.sort(sort.arrayList, sortOrder);

// now - how do I get the sorted fileNames from here?
}

排序类

public class Sort<File> implements Comparator<Sort<File>> {

private File file;
public ArrayList <Sort> arrayList = new ArrayList <Sort> ();


public Sort(File file) {
    this.file = file;
}

public Sort() {

}

public String getName() {
    return this.file.toString();
}

// callback-method. Used when calling Collections.sort() in the other class.
public int compare(Sort<File> n1, Sort<File> n2){
 // how do I sort objects on Filesnames.
}    

最佳答案

首先,如果你想要Comparator比较File然后告诉它:

public class Sort implements Comparator<File> {

    @Override
    public int compare(File n1, File n2){
        return n1.getName().compareTo(n2.getName);
    }    

}

您要求它比较自身的实例。以及声明Sort<File>告诉编译器您想要 generic class 其中泛型类型参数恰好被称为 File 。这与 File 无关class .

为了使用这个Comparator您需要做的就是:

final File file = new File(System.getProperty(dir));
final File[] files = file.listFiles();
Arrays.sort(files, new Sort());
for(final File f : files) {
    //do something with f
}

或者更好的是,只需使用 anonymous class ,这将阻止您对 Comparator 做任何奇怪的事情:

Arrays.sort(files, new Comparator<File>() {
    @Override
    public int compare(File o1, File o2) {
        return o1.getName().compareTo(o2.getName());
    }
});

但是,如果您使用的是 Java 8,则可以完全跳过这个困惑:

final Path path = Paths.get(System.getProperty(dir));
final List<Path> files = new ArrayList<>();
try (final DirectoryStream<Path> stream = Files.newDirectoryStream(path)) {
    stream.forEach(files::add);
}
files.sort(Comparator.comparing(Path::getFileName));

现在你已经排序了 List<Path> ,你可以用它做任何你想做的事。例如将排序后的列表打印到控制台:

files.forEach(System.out::println);

关于java - Java Comparator接口(interface)的使用 - 对文件进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28644484/

相关文章:

java - 模拟静态 Liferay 方法

java - 在 tomcat 上部署应用程序时加载的类过多

java - 当我使用命令 java -jni HelloWorld 时遇到麻烦

java - 使用对象的运行时类实例化泛型类

java - 有没有办法返回不会做任何事情的比较器?

Java 8 : Comparator comparingDouble type mismatch

java - 使用解析图像从 Gridview 到 ViewPager

c++ - 管理模板派生类型的 vector 集合

c++ - 将未知类型和数量的 args 和 concat 传递给 char 数组

java - 为什么在 Collections 中使用比较器而不是 equals()?