使用字符串日期排序Java对象列表

时间:2014-12-26 13:11:33

标签: java sorting collections

我知道有很多关于排序列表/数组等的帖子,但我对最佳方法有点困惑。我的对象列表还包含一个日期字段 - 但该日期存储为字符串,所以我需要先将它们全部转换然后排序,还是有办法使用此参数对列表中的对象进行排序,而无需先转换它们?

基本上就是这个清单:

List<NewsFeed> newslist;

NewsFeed对象:

String title;
String description;
String URL;
String date;

日期看起来像:

Fri Dec 26 23:00:00 AEDT 2014

4 个答案:

答案 0 :(得分:2)

使用此

Collections.sort(newsList, new Comparator<NewsFeed>() {
        DateFormat f = new SimpleDateFormat("dd/MM/yyyy");//or your pattern
        @Override
        public int compare(NewsFeed o1, NewsFeed o2) {
            try {
                return f.parse(o1.getDate()).compareTo(f.parse(o2.getDate()));
            } catch (ParseException e) {
                throw new IllegalArgumentException(e);
            }
        }
    });

使用Comparable,它看起来像这样:

   public class NewsFeed implements Comparable<NewsFeed>{
        //your fields and getters/setters
        private DateFormat f = new SimpleDateFormat("dd/MM/yyyy");//or your pattern
        @Override
        public int compareTo(NewsFeed o) {
            try {
                return f.parse(this.getDate()).compareTo(f.parse(o.getDate()));
            } catch (ParseException e) {
                throw new IllegalArgumentException(e);
            }
       }
}

答案 1 :(得分:2)

您的班级NewsFeed必须实施Comparable界面和@override compareTo方法来定义排序规则。然后使用Arrays.sort方法对newslist进行排序。

class NewsFeed implements Comparable<NewsFeed>{
    //members
    @Override
    public int compareTo(NewsFeed o) {
        // TODO Your sort rule
        return 0;
    }

}

List<NewsFeed> newslist;
...
Arrays.sort(newslist);

答案 2 :(得分:0)

在阅读RSS时将字符串转换为日期,并将其作为日期存储在NewsFeed对象中。然后,您可以实现Comparable接口并委托给日期。

您转换compareTo方法日期的任何答案都会进行不必要的大量转换。

答案 3 :(得分:0)

如果你不能只将日期存储为Date对象,则需要定义一个自定义比较器(最终会隐式地将Strings转换为Date对象,所以你真的可以将它们存储为日期)。您可以将这两个定义为类中的字段:

private final static String dateFormat = "EEE MMM dd HH:mm:ss yyyy";
private final static Comparator<String> dateComp = new Comparator<String>() {
        public int compare(String s1, String s2) {
            Date d1 = null;
            try {
                d1 = new SimpleDateFormat( dateFormat,Locale.ENGLISH ).parse(s1);
            } catch (ParseException e) {
                //HANDLE THIS EXCEPTION
            }

            Date d2 = null;
            try {
                d2 = new SimpleDateFormat( dateFormat,Locale.ENGLISH ).parse(s2);
            } catch (ParseException e) {
                //HANDLE THIS EXCEPTION
            }
            return d1.compareTo(d2);
        }
    };

当然,您必须有效地处理所需的try / catch块和潜在的解析异常。此外,您必须确定传入日期字符串的格式。

以下是使用上述比较器的示例:

    String[] dateArray = new String[] {"Sat Dec 27 23:00:00 2014","Fri Dec 26 23:00:00 2014","Sun Dec 28 23:00:00 2014"};
    List<String> dateList = new ArrayList<String>(Arrays.asList(dateArray));
    Collections.sort(dateList, dateComp);

打印:

[Fri Dec 26 23:00:00 2014, Sat Dec 27 23:00:00 2014, Sun Dec 28 23:00:00 2014]