2013-05-16 25 views
3

我知道有很多类似的问题,因为我的文件,但我还没有与这些问题的答案(我觉得我失去了一些东西......)但不管怎么说远矣:排序链表<File>根据最后修改时间

我有一个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
  • SRC
  • 设置
  • 项目
  • 类路径

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

编辑2 File [] file = new File(“。”)。listFiles();

输出:[Ljava.io.File; @ 3e2a9a49 所以我想这应该是实际问题......?我想要做的是将我的LinkedList中的文件放到这个数组中,但我想我做错了什么,从第一个链接中得到了这个片段......如果这是在任何地方靠近正确的路要走。

预先感谢您,希望我的问题做了一些感觉和你们不要判断我太多:) 我知道我做了这个现在很混乱...

+3

创建一个合适的比较器并将它传递给Collections.sort()。 http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#sort%28java.util.List,%20java.util.Comparator%29 –

+1

您已尝试实施某人代码,它不起作用?为什么不张贴一个最小工作示例,我们可以帮助解决出错的地方。 – Pureferret

回答

3

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

+0

非常感谢!我花了一段时间才明白,但它像梦一样运作! – UserOrNotAnUser

0

整数值返回{1, -1, 0}当与对象比较意味着更大,更小和等于您正在比较的对象。它不会自己做任何事情,但是你知道如果一个更大,更小或等于另一个。

1

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

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

清洁解决方案:'return o1.lastModified() - o2.lastModified();'另请参阅:http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html#compare% 28T,%20T%29 – wau

+0

有一件事我很想知道...... file.lastModified()返回一个long,但该方法应该返回一个int。所以 - 如果我将return语句转换为int类型,那么方法会失败。有没有解决的办法? – UserOrNotAnUser

+0

@UserOrNotAnUser'下转换'使用...'长。parseInt(int foo)' – Pureferret

1

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

我对此表示怀疑!

输出像[Ljava.io.File;@3e2a9a49只是表示您试图在数组上打印调用toString()的结果。


对于第一个链接:什么是返回1,-1或0的交易?它实际上是否做了什么,或者我应该添加一些代码来将它在列表中向上或向下移动?

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

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


这让我为难的事情是,为什么你觉得末这些文件不应该存在。您正在对目录中的文件进行排序。如果这些文件在目录中,那么明显是它们应该位于已排序的数组中,因此是视图。如果它们不在目录中,那么最可能的问题是更新视图的代码...而不是您向我们展示的代码。

+0

好吧,嗯....谢谢。 – UserOrNotAnUser

+0

是的,那可能是,现在已经修好了,你。 更新代码是一个提供的代码,它也更新其他方法中的所有视图。 – UserOrNotAnUser