如何按日期字段对集合进行排序?

时间:2011-08-25 21:39:50

标签: java sorting date comparator

我正在尝试按发布日期对相册进行排序。出于某种原因,我无法到达任何地方:

//sort by release date
Collections.sort(this._items, new Comparator<Album>() {
    public int compare(Album t1, Album t2) {
        int dateCmp = t2.getStartDate().compareTo(t1.getStartDate());
        Log.i("==Albums==", "dateComp: " + dateCmp);
        return t1.getStartDate().compareTo(t2.getStartDate());
    }            
});

我做错了什么?

以下是我在发布日期的Foo Fighters Albums输出中看到的内容:

name: There Is Nothing Left To Lose | release date: 11/2/1999
name: Greatest Hits | release date: 11/3/2009
name: Skin And Bones | release date: 11/7/2006
name: Foo Fighters | release date: 12/10/2003
name: DOA | release date: 12/13/2005
name: Rope | release date: 3/1/2011
name: The Colour And The Shape | release date: 3/30/2010

2 个答案:

答案 0 :(得分:6)

您的startDate字段的类型为java.lang.String。至少,输出中的顺序证实了这一点。 String#compareTo()将按字典顺序排列String个值,而不是它在旁观者眼中所代表的值。

如果您将错误的类型更改为java.util.Date,或使用SimpleDateFormat#parse()String转换为Date方法中的compare(),然后调用{ {3}}然后,排序将按预期工作。

我会用java.util.Date替换它。始终对其所代表的值使用正确的类型。

答案 1 :(得分:0)

这是完整的代码。问题是因为开始日期是字符串类型。

//按发布日期排序

Collections.sort(this._items, new Comparator<Album>() {    
                        public int compare(Album t1, Album t2) {

                            int dateCmp = 0;

                             try {  

                                SimpleDateFormat formatter; 
                                Date date1; 
                                Date date2; 
                                formatter = new SimpleDateFormat("dd/mm/yyyy");

                                date1 = (Date)formatter.parse(t1.getStartDate()); 
                                date2 = (Date)formatter.parse(t2.getStartDate()); 

                                dateCmp = (date2).compareTo(date1);

                              } 
                              catch (Exception e)
                              {
                                //Log.i("==Albums==", "album special sort - error" );
                              }

                            //Log.i("==Albums==", "dateComp: " + dateCmp);

                            return dateCmp; 

                        }               
                    });