una por ordenar objetos numeros nombres listas lista enlazada ejemplo como collection atributo alfabeticamente java sorting collections

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));