【问题标题】:Sorting Java List of objects using string date使用字符串日期对对象的 Java 列表进行排序
【发布时间】:2014-12-26 22:43:12
【问题描述】:

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

所以基本上是列表:

List<NewsFeed> newslist;

NewsFeed 对象:

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

日期看起来像:

Fri Dec 26 23:00:00 AEDT 2014

【问题讨论】:

  • "但是该日期存储为字符串"
  • 您是从数据库中提取此对象列表吗?如果是这样,您可以构建查询以非常轻松地对其进行排序。
  • @Tkachuk_Evgen 要将答案转换为我的列表 - 我是否只是将其嵌套在 foreach 类型循环中? thx 的链接。否则,列表来自 RSS 提要 - 这就是为什么每个成员都是 String 但显然我可以转换它

标签: java sorting collections


【解决方案1】:

使用这个

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);
            }
       }
}

【讨论】:

  • 如果我使用 Comparable 接口,我在 compareTo 方法中比较什么?我比较哪些日期?看这个例子javamex.com/tutorials/collections/… 它正在传递一些东西来比较 - 但是我如何比较一个 List ?谢谢
  • 我很感激,那是完美的,谢谢你,我希望我能奖励一百万积分! :)
  • 嘿,我正在尝试同样的事情,但我的日期不包含时间它的格式仅为 yyyy-MM-dd。当我尝试使用上述方法进行排序时,它不起作用。如何对列表进行排序?
  • @Tkachuk_Evgen 我做到了。但它仍然没有对列表进行排序。
【解决方案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);

【讨论】:

【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    如果您不能只将日期存储为 Date 对象,则需要定义一个自定义比较器(最终会将字符串隐式转换为 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]
    

    【讨论】:

      猜你喜欢
      • 2016-04-04
      • 2018-07-07
      • 2010-11-11
      • 2013-01-18
      • 2021-01-17
      • 1970-01-01
      • 2020-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多