如何按日期对对象列表进行排序(java集合,List )
private List movieItems = null; public List 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:数组索引超出范围:java.util.Vector.get(Vector.java:694)中的java,位于java.util.Arrays的entitybeans.jsf.PeliculaController $ 1.compare(PeliculaController.java:260) .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)位于com.sun.faces的javax.el.BeanELResolver.getValue(BeanELResolver.java:022)javax.el.CompositeELResolver.getValue(CompositeELResolver.java:175)。 el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72)at com.sun.el.parser.AstValue.getValue(AstValue.java:116)at com.sun.el.parser.A stValue.getValue(AstValue.java:163)….
在compare
方法中, o1
和o2
已经是movieItems
列表中的元素。 所以,你应该做这样的事情:
Collections.sort(movieItems, new Comparator() { public int compare(Movie m1, Movie m2) { return m1.getDate().compareTo(m2.getDate()); } });
不要访问或修改Comparator
的集合。 比较器应仅用于确定哪个对象先于另一个对象。 要比较的两个对象作为参数提供。
Date
本身具有可比性,因此,使用generics:
class MovieComparator implements Comparator { 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();
在Java 8中,它现在很简单:
movieItems.sort(Comparator.comparing(Movie::getDate));
您错误地使用了Comparators
。
Collections.sort(movieItems, new Comparator(){ public int compare (Movie m1, Movie m2){ return m1.getDate().compareTo(m2.getDate()); } });
我会添加Commons NullComparator来避免一些问题……
你可以用这个:
Collections.sort(list, org.joda.time.DateTimeComparator.getInstance());
- 如何使用crypto-js库在客户端加密消息并在Java服务器上解密它
- Spring单例和Java singeleton(设计模式)有什么区别?
- 在哪里可以找到用于Java的语法高亮库?
- 对应于.net中的Newtonsoft.Json.JsonConvert.SerializeObject(Object source,Newtonsoft.Json.JsonSerializerSettings())的java代码?
- ApplicationContext.xml和属性文件的位置在spring中
- Yacc相当于Java
- 如何从AES-256切换到AES-128?
- 在Java中实现Scala PartialFunction的最简单方法是什么?
- 如何自动关闭JOptionPane?