使用Comparator接口Java - 排序文件

时间:2015-02-21 10:02:28

标签: java generics comparator

我有一个程序来对计算机的某个目录中的文件进行排序。我使用Comparator接口并使用collections.sort-method但我无法访问输出 - 来自调用类。我也不知道如何对Sort-class中的对象进行排序。

1)如果有人能告诉我如何使用比较方法(原型是:sort(列表列表,比较器c)

,那将很高兴

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

class创建类Sort对象的目录,并将它们放入Arraylist(Sort的成员)

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

Sort-class

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

2 个答案:

答案 0 :(得分:2)

首先,如果您希望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);

答案 1 :(得分:-1)

您只需循环遍历这些值并执行这些值所需的任务。

所以在你的例子中:

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

// now - how do I get the sorted fileNames from here?
   for (Sort<File> arrayList : file) {
     System.out.println("Sorted list filenames: " + file.getName());
     /* ... other actions ... */
   }

}

如果您已经实现了正确的通用comparator方法

,那应该很简单