【问题标题】:Sorting LinkedList<File> according to the files last modified time根据文件最后修改时间排序 LinkedList<File>
【发布时间】:2013-05-16 08:31:48
【问题描述】:

我知道有很多与我类似的问题,但我没有得到任何答案(我觉得我错过了一些东西......)但无论如何:

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

例如,我尝试在我的程序中根据这两个实现一些东西:Finding the 3 most recently modified files in a long list of filesGet files in a directory sorted by last modified?,但我似乎并没有对列表进行排序。

对于第一个链接:返回 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
}

编辑 我最大的问题(也许?)是当我的方法完成时,它确实更新了视图,但不是以正确的方式:“旧”列表仍然是一样的,但在底部有一些不应该的东西...:

  • file1.jpg
  • file2.jpg
  • ..
  • ..
  • ..
  • imagelist.txt
  • bin
  • 源代码
  • 设置
  • 项目
  • 类路径

(imagelist.txt 是存储图像路径的文本文件),出于某种原因,这是我在更新视图后可以看到的列表。

编辑 2 File[] file = new File(".").listFiles();

输出:[Ljava.io.File;@3e2a9a49 所以我想这将是实际问题......?我试图做的是将文件从我的 LinkedList 放到这个数组中,但我想我做错了什么,从第一个链接得到了这个 sn-p ......如果这样做,什么是合适的方法?离正确的路很近。

提前谢谢你,希望我的问题有点道理,你们不要太评价我:) 我知道我现在让这很混乱......

【问题讨论】:

  • 创建一个适当的Comparator 并将其传递给Collections.sort()docs.oracle.com/javase/7/docs/api/java/util/…
  • 你尝试实现某人的代码,但它不起作用?为什么不发布一个最低工作示例,我们可以帮助找出问题所在。

标签: java linked-list java-7 last-modified


【解决方案1】:

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

【讨论】:

  • 非常感谢!我花了一段时间才明白,但它就像一场梦!
【解决方案2】:

输出:[Ljava.io.File;@3e2a9a49 所以我想这将是实际问题......?

我怀疑!

[Ljava.io.File;@3e2a9a49 这样的输出仅表示您尝试在数组上打印调用toString() 的结果。


对于第一个链接:返回 1、-1 或 0 是什么意思?它实际上有什么作用吗,还是我应该添加一些代码来将其向上或向下移动?

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

不,您不应该在排序时移动元素。如果在对数组进行排序时这样做,结果将是不可预测的。


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

【讨论】:

  • 是的,可能是这样,你现在修好了。更新代码是提供的代码,它也会更新其他方法中的所有视图。
【解决方案3】:

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

       @Override
        public int compare(File o1, File o2) {
            return o1.lastModified() > o2.lastModified() ? 1 : 0;
        }

【讨论】:

  • 更清洁的解决方案:return o1.lastModified() - o2.lastModified(); 另见:docs.oracle.com/javase/6/docs/api/java/util/…
  • 我想知道的一件事... file.lastModified() 返回一个 long,但该方法应该返回一个 int。所以 - 如果我将 return 语句转换为 int,该方法有点失败。有没有办法解决这个问题?
  • @UserOrNotAnUser 用于“向下转换”使用 ...Long.parseInt(int foo)
  • 你我想我问错了问题......该方法需要返回一个 int,lastModfied() 返回一个 long,这就是我需要的,但 Eclipse 只是一直在抱怨。所以我不能将它转换为 int,我也不能将返回类型更改为 long,即使 Eclipse 建议这样做,因为还有很多其他的不兼容......
【解决方案4】:

与对象比较时返回的整数值 {1, -1, 0} 意味着大于、小于和等于您正在比较的对象。它自己什么都不做,但你知道一个更大、更小还是等于另一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 2011-09-17
    相关资源
    最近更新 更多