首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何按日期对对象列表进行排序(java集合、List<Object>)

如何按日期对对象列表进行排序(java集合、List<Object>)
EN

Stack Overflow用户
提问于 2011-03-06 05:53:42
回答 6查看 118.3K关注 0票数 19
private List<Movie> movieItems = null;
public List<Movie> getMovieItems() {
    final int first = 0;
    if (movieItems == null) {
        getPagingInfo();
        movieItems = jpaController.findRange(new int[]{pagingInfo.getFirstItem(), pagingInfo.getFirstItem() + pagingInfo.getBatchSize()});
        Collections.sort(movieItems, new Comparator(){
           public int compare (Object o1, Object o2){
               Date d1 = movieItems.get(((Movie)o1).getMovieId()).getDate();
               Date d2 = movieItems.get(((Movie)o2).getMovieId()).getDate();
               if(d1.before(d2)){
                   movieItems.set(1, (Movie)o1);
                   movieItems.set(2, (Movie)o2);
               }
               return first;
           }
       });
    }
    return movieItems;
}

jpaController将带回4部电影,并给我以下内容

java.lang.ArrayIndexOutOfBoundsException:数组索引超出范围:4位于位于entitybeans.jsf.PeliculaController$1.compare(PeliculaController.java:260)的java.util.Vector.get(Vector.java:694)位于java.util.Arrays.mergeSort(Arrays.java:1270)位于位于java.util.Collections.sort(Collections.java:159)的java.util.Arrays.sort(Arrays.java:1210)位于entitybeans.jsf.PeliculaController.getPeliculaItems(PeliculaController.java:257)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at javax.el.BeanELResolver.getValue(BeanELResolver.java:302) at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:175) at com.sun.faces.el.FacesCompositeELResolver.getValue(com.sun.el.parser.AstValue.getValue(AstValue.java:116) at com.sun.el.parser.AstValue.getValue(AstValue.java:163)....

的FacesCompositeELResolver.java:72)

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-03-06 05:55:47

compare方法中,o1o2已经是movieItems列表中的元素。所以,你应该这样做:

Collections.sort(movieItems, new Comparator<Movie>() {
    public int compare(Movie m1, Movie m2) {
        return m1.getDate().compareTo(m2.getDate());
    }
});
票数 59
EN

Stack Overflow用户

发布于 2011-03-06 05:55:54

请勿访问或修改Comparator中的集合。应该只使用比较器来确定哪个对象在另一个对象之前。要比较的两个对象是作为参数提供的。

Date本身是可比较的,所以,使用泛型:

class MovieComparator implements Comparator<Movie> {
    public int compare(Movie m1, Movie m2) {
       //possibly check for nulls to avoid NullPointerException
       return m1.getDate().compareTo(m2.getDate());
    }
}

并且不在每个排序上实例化比较器。使用:

private static final MovieComparator comparator = new MovieComparator();
票数 22
EN

Stack Overflow用户

发布于 2016-07-29 06:27:27

在Java 8+中,它现在就像这样简单:

movieItems.sort(Comparator.comparing(Movie::getDate));
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5207029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档