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)
发布于 2011-03-06 05:55:47
在compare
方法中,o1
和o2
已经是movieItems
列表中的元素。所以,你应该这样做:
Collections.sort(movieItems, new Comparator<Movie>() {
public int compare(Movie m1, Movie m2) {
return m1.getDate().compareTo(m2.getDate());
}
});
发布于 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();
发布于 2016-07-29 06:27:27
在Java 8+中,它现在就像这样简单:
movieItems.sort(Comparator.comparing(Movie::getDate));
https://stackoverflow.com/questions/5207029
复制相似问题