简体   繁体   English

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

[英]How to sort a List of objects by their date (java collections, List<Object>)

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 is bringing back 4 movies and is giving me the following jpaController 带回了 4 部电影,并给了我以下内容

java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 4 at java.util.Vector.get(Vector.java:694) at entitybeans.jsf.PeliculaController$1.compare(PeliculaController.java:260) at java.util.Arrays.mergeSort(Arrays.java:1270) at java.util.Arrays.sort(Arrays.java:1210) at java.util.Collections.sort(Collections.java:159) at 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(FacesCompositeELResolver.java:72) at com.sun.el.parser.AstValue.getValue(AstValue.java:116) at com.sun.el.parser.A java.lang.ArrayIndexOutOfBoundsException:数组索引超出范围:4 at java.util.Vector.get(Vector.java:694) at entitybeans.jsf.PeliculaController$1.compare(PeliculaController.java:260) at java.util.Arrays .mergeSort(Arrays.java:1270) at java.util.Arrays.sort(Arrays.java:1210) at java.util.Collections.sort(Collections.java:159) at 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(FacesCompositeELResolver.java:72) 在 com.sun.el.parser.AstValue.getValue(AstValue.java:116) 在 com.sun.el.parser.A stValue.getValue(AstValue.java:163).... stValue.getValue(AstValue.java:163)....

In your compare method, o1 and o2 are already elements in the movieItems list.在您的compare方法中, o1o2已经是movieItems列表中的元素。 So, you should do something like this:所以,你应该做这样的事情:

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

Do not access or modify the collection in the Comparator .不要访问或修改Comparator的集合。 The comparator should be used only to determine which object is comes before another.比较器应该只用于确定哪个对象在另一个对象之前。 The two objects that are to be compared are supplied as arguments.要比较的两个对象作为参数提供。

Date itself is comparable, so, using generics: 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());
    }
}

And do not instantiate the comparator on each sort.并且不要在每种类型上实例化比较器。 Use:用:

private static final MovieComparator comparator = new MovieComparator();

在 Java 8+ 中,它现在很简单:

movieItems.sort(Comparator.comparing(Movie::getDate));

You're using Comparators incorrectly.您错误地使用了Comparators

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

你可以使用这个:

Collections.sort(list, org.joda.time.DateTimeComparator.getInstance());

我会添加 Commons NullComparator 来避免一些问题......

Using Java 8 functionality it will be simpler. 使用Java 8功能会更简单。

syntax : LIST_NAME.sort(Comparator.comparing(INFO_CLASS::getMethod)); 语法 :LIST_NAME.sort(Comparator.comparing(INFO_CLASS :: getMethod));

example : movieItems.sort(Comparator.comparing(Movie::getDate)); 示例 :movieItems.sort(Comparator.comparing(Movie :: getDate));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM