numeros - Cómo ordenar una lista de objetos por fecha(colecciones java, lista<Objeto>)
ordenar una lista de numeros en java (7)
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 está regresando 4 películas y me está dando lo siguiente
java.lang.ArrayIndexOutOfBoundsException: Array index fuera de rango: 4 en java.util.Vector.get (Vector.java:694) en entitybeans.jsf.PeliculaController $ 1.compare (PeliculaController.java:260) en java.util.Arrays .mergeSort (Arrays.java:1270) en java.util.Arrays.sort (Arrays.java:1210) en java.util.Collections.sort (Collections.java:159) en entitybeans.jsf.PeliculaController.getPeliculaItems (PeliculaController. java: 257) en sun.reflect.NativeMethodAccessorImpl.invoke0 (Método nativo) en sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl. .reflect.Method.invoke (Method.java:597) en javax.el.BeanELResolver.getValue (BeanELResolver.java:302) en javax.el.CompositeELResolver.getValue (CompositeELResolver.java:175) en com.sun.faces. el.FacesCompositeELResolver.getValue (FacesCompositeELResolver.java:72) en com.sun.el.parser.AstValue.getValue (AstValue.java:116) en com.sun.el.parser.A stValue.getValue (AstValue.java:163) ....
Añadiría Commons NullComparator en lugar de evitar algunos problemas ...
En Java 8, ahora es tan simple como:
movieItems.sort(Comparator.comparing(Movie::getDate));
En su método de compare
, o1
y o2
ya son elementos en la lista movieItems
. Entonces, deberías hacer algo como esto:
Collections.sort(movieItems, new Comparator<Movie>() {
public int compare(Movie m1, Movie m2) {
return m1.getDate().compareTo(m2.getDate());
}
});
Estás utilizando Comparators
incorrectamente.
Collections.sort(movieItems, new Comparator<Movie>(){
public int compare (Movie m1, Movie m2){
return m1.getDate().compareTo(m2.getDate());
}
});
No acceda ni modifique la colección en el Comparator
. El comparador se debe usar solo para determinar qué objeto está antes que otro. Los dos objetos que deben compararse se suministran como argumentos.
Date
sí es comparable, entonces, usando genéricos:
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());
}
}
Y no ejemplifique el comparador en cada orden. Utilizar:
private static final MovieComparator comparator = new MovieComparator();
Puedes usar esto:
Collections.sort(list, org.joda.time.DateTimeComparator.getInstance());
Usando la funcionalidad de Java 8 será más sencillo.
sintaxis : LIST_NAME.sort (Comparator.comparing (INFO_CLASS :: getMethod));
ejemplo : movieItems.sort (Comparator.comparing (Movie :: getDate));