Ign*_*rat 17 java sorting collections
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;
}
Run Code Online (Sandbox Code Playgroud)
jpaController带回了4部电影,给我以下内容
在java.util.Arrays中在java.util.Vector.get(Vector.java:694)在entitybeans.jsf.PeliculaController $ 1.compare(PeliculaController.java:260)4:java.lang.ArrayIndexOutOfBoundsException:数组索引超出范围.mergeSort(Arrays.java:1270)在java.util.Arrays.sort(Arrays.java:1210)在java.util.Collections.sort(Collections.java:159)在entitybeans.jsf.PeliculaController.getPeliculaItems(PeliculaController.的java:257)在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)在java.lang中.reflect.Method.invoke(Method.java:597)在javax.el.BeanELResolver.getValue(BeanELResolver.java:302)在javax.el.CompositeELResolver.getValue(CompositeELResolver.java:175)在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)....
pwc*_*pwc 55
在您的compare方法中,o1并且o2已经是movieItems列表中的元素.所以,你应该做这样的事情:
Collections.sort(movieItems, new Comparator<Movie>() {
public int compare(Movie m1, Movie m2) {
return m1.getDate().compareTo(m2.getDate());
}
});
Run Code Online (Sandbox Code Playgroud)
Boz*_*zho 21
不要访问或修改中的集合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());
}
}
Run Code Online (Sandbox Code Playgroud)
并且不要在每种类型上实例化比较器.使用:
private static final MovieComparator comparator = new MovieComparator();
Run Code Online (Sandbox Code Playgroud)
vph*_*nyc 16
在Java 8中,现在它很简单:
movieItems.sort(Comparator.comparing(Movie::getDate));
Run Code Online (Sandbox Code Playgroud)
Ste*_*all 15
您的使用Comparators不正确.
Collections.sort(movieItems, new Comparator<Movie>(){
public int compare (Movie m1, Movie m2){
return m1.getDate().compareTo(m2.getDate());
}
});
Run Code Online (Sandbox Code Playgroud)