Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用字符串日期对Java对象列表进行排序_Java_Sorting_Collections - Fatal编程技术网

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

使用字符串日期对Java对象列表进行排序,java,sorting,collections,Java,Sorting,Collections,我知道在排序列表/数组等方面有很多帖子,但我有点困惑,不知道最好的方法是什么。我的对象列表还包含一个日期字段,但该日期存储为字符串,因此我是否需要先将它们全部转换,然后进行排序,或者是否有一种方法可以使用此参数对列表中的对象进行排序,而无需先转换它们 因此,基本上清单如下: List<NewsFeed> newslist; 日期看起来像: Fri Dec 26 23:00:00 AEDT 2014 用这个 Collections.sort(newsList, new Compar

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

因此,基本上清单如下:

List<NewsFeed> newslist;
日期看起来像:

Fri Dec 26 23:00:00 AEDT 2014
用这个

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);
            }
        }
    });
用这个

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

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


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

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

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

您的类NewsFeed必须实现Comparable接口和@override compareTo方法来定义排序规则。然后使用Arrays.sort方法对新闻列表进行排序

类NewsFeed必须实现Comparable接口和@override compareTo方法来定义排序规则。然后使用Arrays.sort方法对新闻列表进行排序


如果不能仅将日期存储为日期对象,则需要定义一个自定义比较器,该比较器最终会隐式地将字符串转换为日期对象,因此您也可以将其存储为日期。您可以将这两个字段定义为类中的字段:

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

如果不能仅将日期存储为日期对象,则需要定义一个自定义比较器,该比较器最终会隐式地将字符串转换为日期对象,因此您也可以将其存储为日期。您可以将这两个字段定义为类中的字段:

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

但该日期存储为字符串。您是否从数据库中提取此对象列表?如果是这样的话,您可以构建您的查询来非常轻松地对它们进行排序。请查看@Tkachuk_Evgen以将该答案转换为我的列表-我是否只是将其嵌套在foreach类型循环中?链接的thx。否则,列表来自RSS提要-这就是为什么每个成员都是字符串,但显然我可以转换它,但该日期存储为字符串。您是否从数据库中提取此对象列表?如果是这样的话,您可以构建您的查询来非常轻松地对它们进行排序。请查看@Tkachuk_Evgen以将该答案转换为我的列表-我是否只是将其嵌套在foreach类型循环中?链接的thx。否则,列表来自RSS提要-这就是为什么每个成员都是字符串,但显然我可以转换它。我喜欢这个想法-但从未使用过可比较的接口,在compareTo方法中,我在列表意义上比较什么-我没有在概念上理解这一点。同时,我将研究这种类似的用法,thx;有一些例子我很喜欢这个想法,但是我从来没有使用过compareTo方法中的comparable接口,我在列表意义上比较的是什么,我没有从概念上理解这个问题。同时,我将研究这种类似的用法,thx;这里有一些例子,如果我使用Comparable接口,我在compareTo方法中比较什么?我应该比较哪些日期?看看这个例子,它传递了一些要比较的东西——但是如何比较列表呢?thxI我非常感激,这太完美了,谢谢你我希望我能因为坚持我而奖励一百万分!:嘿,我也在尝试同样的事情,但是我的日期不包含时间,它的格式只有yyyy MM dd。当我尝试使用上述方法进行排序时,它不起作用。我该如何对列表进行排序?@Tkachuk_Evgen我是这样做的。但是它仍然没有对列表进行排序。如果我使用Comparable接口,那么在compareTo方法中我应该比较什么?我应该比较哪些日期?看看这个例子,它传递了一些要比较的东西——但是如何比较列表呢?thxI我非常感激,这太完美了,谢谢你我希望我能因为坚持我而奖励一百万分!:嘿,我也在尝试同样的事情,但是我的日期不包含时间,它的格式只有yyyy MM dd。当我尝试使用上述方法进行排序时,它不起作用。我该如何对列表进行排序?@Tkachuk_Evgen我是这样做的。但它仍然没有对列表进行排序。
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);
        }
    };
    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]