如何按对象的日期对对象列表进行排序(java集合,List<;Object>;) private List movieItems=null; 公共列表getMovieItems(){ 最终int first=0; if(movieItems==null){ getPaginInfo(); movieItems=jpaController.findRange(新int[]{pagininfo.getFirstItem(),pagininfo.getFirstItem()+pagininfo.getBatchSize()}); Collections.sort(movieItems,newcomparator(){ 公共整数比较(对象o1、对象o2){ 日期d1=movieItems.get((Movie)o1.getMovieId()).getDate(); Date d2=movieItems.get((Movie)o2.getMovieId()).getDate(); 若(d1.在(d2)之前){ movieItems.set(1,(Movie)o1); 电影项目。设置(2,(电影)o2); } 先返回; } }); } 归还电影物品; }
jpaController将带回4部电影,并向我提供以下信息 java.lang.ArrayIndexOutOfBoundsException:数组索引超出范围:4 在java.util.Vector.get(Vector.java:694)处 entitybeans.jsf.peliculantroller$1.compare(peliculantroller.java:260) 位于java.util.Arrays.mergeSort(Arrays.java:1270) java.util.Arrays.sort(Arrays.java:1210)位于 java.util.Collections.sort(Collections.java:159)位于 entitybeans.jsf.peliculantroller.getPeliculaItems(peliculantroller.java:257) 位于的sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) invoke(NativeMethodAccessorImpl.java:39) 在 reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 位于java.lang.reflect.Method.invoke(Method.java:597) javax.el.BeanELResolver.getValue(BeanELResolver.java:302)位于 getValue(CompositeELResolver.java:175) 在 FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72) 位于com.sun.el.parser.AstValue.getValue(AstValue.java:116) com.sun.el.parser.AstValue.getValue(AstValue.java:163)如何按对象的日期对对象列表进行排序(java集合,List<;Object>;) private List movieItems=null; 公共列表getMovieItems(){ 最终int first=0; if(movieItems==null){ getPaginInfo(); movieItems=jpaController.findRange(新int[]{pagininfo.getFirstItem(),pagininfo.getFirstItem()+pagininfo.getBatchSize()}); Collections.sort(movieItems,newcomparator(){ 公共整数比较(对象o1、对象o2){ 日期d1=movieItems.get((Movie)o1.getMovieId()).getDate(); Date d2=movieItems.get((Movie)o2.getMovieId()).getDate(); 若(d1.在(d2)之前){ movieItems.set(1,(Movie)o1); 电影项目。设置(2,(电影)o2); } 先返回; } }); } 归还电影物品; },java,sorting,collections,Java,Sorting,Collections,jpaController将带回4部电影,并向我提供以下信息 java.lang.ArrayIndexOutOfBoundsException:数组索引超出范围:4 在java.util.Vector.get(Vector.java:694)处 entitybeans.jsf.peliculantroller$1.compare(peliculantroller.java:260) 位于java.util.Arrays.mergeSort(Arrays.java:1270) java.util.
您使用的比较器不正确
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;
}
Collections.sort(movieItems,newcomparator(){
公共整数比较(电影m1、电影m2){
返回m1.getDate().compareTo(m2.getDate());
}
});
在您的compare
方法中,o1
和o2
已经是movieItems
列表中的元素。所以,你应该这样做:
Collections.sort(movieItems, new Comparator<Movie>(){
public int compare (Movie m1, Movie m2){
return m1.getDate().compareTo(m2.getDate());
}
});
Collections.sort(movieItems,newcomparator(){
公共整数比较(电影m1、电影m2){
返回m1.getDate().compareTo(m2.getDate());
}
});
请勿访问或修改比较器中的集合。比较器只能用于确定哪个对象在另一个对象之前。要比较的两个对象作为参数提供
Date
本身是可比较的,因此,使用泛型:
Collections.sort(movieItems, new Comparator<Movie>() {
public int compare(Movie m1, Movie m2) {
return m1.getDate().compareTo(m2.getDate());
}
});
我将添加Commons NullComparator以避免一些问题…您可以使用以下方法:
private static final MovieComparator comparator = new MovieComparator();
在Java 8+中,它现在非常简单:
Collections.sort(list, org.joda.time.DateTimeComparator.getInstance());
但是,movieItems
是Movie
对象的列表,而不是Date
对象代码>我think@AdrienBe,我想你是对的。普华永道,请在你的答案中包含阿德里安的建议。我使用这个代码工作正常。我需要从arraylist获取两个日期(开始、结束)之间的数据。我如何更改代码?Joda是一个需要导入的大型框架,因此除非您使用框架中的更多函数,否则我不建议使用此方法。太棒了!谢谢java8和@bphilipnyc!
Collections.sort(list, org.joda.time.DateTimeComparator.getInstance());
movieItems.sort(Comparator.comparing(Movie::getDate));