我知道有很多类似的问题,但我没有得到任何答案(我觉得我错过了什么......)但是反正:
我有一个LinkedList。在我的程序中,用户应该能够根据文件的上次修改时间对列表进行排序。
我试图在我的程序中尝试根据这两个来实现一些东西:Finding the 3 most recently modified files in a long list of files和Get files in a directory sorted by last modified?,但我似乎无论如何都不会对列表进行排序。
对于第一个链接:返回1,-1或0的处理是什么?它实际上是做了什么,还是应该添加一些代码来向上或向下移动它?
我猜其中任何一个都是我应该使用的,对吧?我想知道该代码是否足够,或者我是否需要添加更多内容才能使其正常工作?
NB。我想在现有的类中创建一个新方法。
所以这就是我试图做的事情:
public static final Comparator<File> lastModified = new Comparator<File>() {
@Override
public int compare(File o1, File o2) {
return o1.lastModified() == o2.lastModified() ? 0 : (o1.lastModified() < o2.lastModified() ? 1 : -1);
}
};
public void testFileSort() {
File[] file = new File(".").listFiles();
Arrays.sort(file, lastModified);
//a snippet to actually update what the user sees
}
修改 我最大的问题(也许?)是,当我的方法完成后,它会更新视图,但不是以正确的方式:“旧”列表仍然是相同的,但在底部有一些不应该是......:
(imagelist.txt是存储图像路径的文本文件),出于某种原因,这是我在更新视图后可以看到的列表。
编辑2 File [] file = new File(“。”)。listFiles();
输出:[Ljava.io.File; @ 3e2a9a49 所以我想这会是实际问题......?我试图做的是将我的LinkedList中的文件放到这个数组中,但我想我做错了什么,从第一个链接获得了这个片段......如果这是任何地方,那么这样做的合适方法是什么接近适当的路要走。
提前谢谢你,希望我的问题有道理,你们不要过多地评价我:) 我知道我现在很困惑......
答案 0 :(得分:3)
第一个链接中的代码足够只使用Linked list而不是files array。实际上,比较是在比较器内进行的。为了使比较器通用,它只需要知道下一个元素是更大,还是更小或相等。它不需要知道有关元素本身的任何细节。因此,在比较器函数中,您正在处理逻辑(最后修改时间是否更早),并基于将信息发送到比较器逻辑1,-1或0,以使其知道它更大,更小或相等比较元素。希望这是有道理的。
答案 1 :(得分:1)
有一个返回file.lastModified()
的方法long
。您可以根据此情况编写自定义比较器。
赞:
@Override
public int compare(File o1, File o2) {
return o1.lastModified() > o2.lastModified() ? 1 : 0;
}
答案 2 :(得分:1)
输出:[Ljava.io.File; @ 3e2a9a49所以我想这会是实际问题......?
我对此表示怀疑!
[Ljava.io.File;@3e2a9a49
之类的输出只是意味着您尝试在数组上打印调用toString()
的结果。
对于第一个链接:返回1,-1或0的处理是什么?它实际上是做了什么,还是应该添加一些代码来向上或向下移动它?
-1,0,+ 1的点是它告诉排序算法第一个参数是“小于”,“等于”还是“大于”第二个参数论点。有关更多信息,请阅读Comparator
接口的javadoc。
在排序时,不应该移动元素。如果在对数组进行排序时执行此操作,结果将无法预测。
令我困惑的是为什么你认为最后那些文件不应该存在。您正在排序目录中的文件。如果这些文件在目录中,那么显然它们应该在排序的数组中,因此它们应该在视图中。如果它们不在目录中,那么最可能的问题是更新视图的代码...而不是您向我们展示的代码。
答案 3 :(得分:0)
与对象比较时返回的整数值{1, -1, 0}
意味着比您要比较的对象更大,更小和相等。它本身没有任何作用,但是你知道一个是更大,更小还是等于另一个。