我有一个程序来对计算机的某个目录中的文件进行排序。我使用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.
}
答案 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方法
,那应该很简单