Java 排序LinkedList<;文件>;根据上次修改的文件时间

Java 排序LinkedList<;文件>;根据上次修改的文件时间,java,linked-list,java-7,last-modified,Java,Linked List,Java 7,Last Modified,我知道有很多和我类似的问题,但我没有得到任何答案(我觉得我错过了什么…),但无论如何: 我有一个链接列表。在我的程序中,用户应该能够根据文件的上次修改时间对列表进行排序 例如,我曾尝试根据这两种方法实现一些东西:在我的程序中,但我似乎没有对列表进行排序 对于第一个链接:返回1、-1或0有什么关系?它真的有什么作用吗,或者我应该添加一些代码来将它在列表中上移或下移 我想这两种都是我应该用的,对吧?我想知道这些代码是否足够,或者我是否需要添加更多的东西来让它工作 注意。我想在现有类中创建一个新方法

我知道有很多和我类似的问题,但我没有得到任何答案(我觉得我错过了什么…),但无论如何:

我有一个链接列表。在我的程序中,用户应该能够根据文件的上次修改时间对列表进行排序

例如,我曾尝试根据这两种方法实现一些东西:在我的程序中,但我似乎没有对列表进行排序

对于第一个链接:返回1、-1或0有什么关系?它真的有什么作用吗,或者我应该添加一些代码来将它在列表中上移或下移

我想这两种都是我应该用的,对吧?我想知道这些代码是否足够,或者我是否需要添加更多的东西来让它工作

注意。我想在现有类中创建一个新方法

下面是我试图做的:

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
}
公共静态最终比较器lastModified=新比较器(){
@凌驾
公共整数比较(文件o1、文件o2){
返回o1.lastModified()==o2.lastModified()?0:(o1.lastModified()
编辑 我最大的问题(也许?)是,当我的方法完成时,它确实会更新视图,但不是以正确的方式:“旧”列表仍然是一样的,但在底部有一些不应该存在的东西…:

  • file1.jpg
  • file2.jpg
  • imagelist.txt
  • 垃圾箱
  • src
  • 背景
  • 计划
  • 类路径
(imagelist.txt是一个存储ImagePath的文本文件),出于某种原因,这就是我在更新视图后可以看到的列表

编辑2 File[]File=新文件(“.”).listFiles()

输出:[Ljava.io.File;@3e2a9a49 所以我想这才是真正的问题…?我想做的是把我的LinkedList中的文件放到这个数组中,但我想我做错了什么,从第一个链接中得到了这个片段…如果这是一个合适的方法,那么什么才是合适的方法呢

提前谢谢你们,希望我的问题有点道理,你们不要对我评价太多:)
我知道我现在把它弄糊涂了…

第一个链接中的代码就足够了,只需使用链表而不是文件数组。实际上,比较是在比较器内部进行的。要使比较器通用,只需要知道下一个元素是大还是小或相等。它不需要知道任何有关的详细信息元素本身。因此,在comparator函数中,您正在处理逻辑(上次修改的时间早于或不早于此),并基于此,使用1、-1或0向比较器逻辑发送信息,让它知道它更大、更小或等于被比较的元素。希望这有意义。

返回的整数值
{1、-1、0}
当与对象进行比较时,表示比您正在比较的对象大、小、相等。它本身不做任何事情,但您知道其中一个是否比另一个大、小或相等。

有一个方法
file.lastModified()
返回
long
。您可以根据这一点编写自定义比较器。
如:

       @Override
        public int compare(File o1, File o2) {
            return o1.lastModified() > o2.lastModified() ? 1 : 0;
        }
输出:[Ljava.io.File;@3e2a9a49所以我想这就是实际的问题

我怀疑

[Ljava.io.File;@3e2a9a49
这样的输出仅仅意味着您试图在数组上打印调用
toString()
的结果


对于第一个链接:返回1、-1或0有什么作用?它实际上有什么作用吗?或者我应该添加一些代码来在列表中上移或下移它吗

-1,0,+1的要点是它告诉排序算法第一个参数是“小于”、“等于”还是“大于”第二个参数。有关更多信息,请阅读
Comparator
接口的javadocs

不,排序时不应移动元素。如果在排序数组时移动元素,则结果将不可预测



让我困惑的是,为什么你认为最后的那些文件不应该在那里。你正在对目录中的文件进行排序。如果这些文件在目录中,那么它们显然应该在排序数组中,因此也应该在视图中。如果它们不在目录中,那么最有可能的问题是更新视图的代码…不是您向我们展示的代码。

创建一个适当的
比较器
,并将其传递给
集合。sort()
。您尝试实现了一些代码,但它不起作用?为什么不发布一个最低限度的工作示例,我们就可以帮助找出错误所在。更干净的解决方案:
返回o1.lastModified()-o2.lastModified()
另请参见:我想知道的一件事是…file.lastModified()返回一个long,但该方法应该返回一个int。因此-如果我将return语句转换为int,该方法就会失败。有没有办法解决这个问题?@UserOrNotAnUser使用…
long.parseInt(int-foo)
我想我问错问题了……该方法需要返回一个int,lastmodified()返回一个long,这就是我所需要的,但是Eclipse一直在抱怨。所以我不能将它转换为int,也不能将返回类型更改为long,尽管Eclipse建议这样做,因为还有很多其他的不兼容性…谢谢你,太多了!我花了一段时间才理解,但它就像梦一样工作!是的,可能是,明白了吗它现在修复了,古。更新代码是一个提供的代码,它也更新了其他方法中的所有视图。