Foros del Web » Programación para mayores de 30 ;) » Java »

Ordenar ArrayList

Estas en el tema de Ordenar ArrayList en el foro de Java en Foros del Web. Hola a todos, tengo una arraylist de clase EdgeSavings y me gustaría ordenar el arraylist que obtengo después de aplicar el calculo correspondiente según el ...
  #1 (permalink)  
Antiguo 07/05/2015, 09:54
Avatar de maiksix  
Fecha de Ingreso: noviembre-2014
Ubicación: Sabadell
Mensajes: 124
Antigüedad: 9 años, 5 meses
Puntos: 1
Ordenar ArrayList

Hola a todos,

tengo una arraylist de clase EdgeSavings y me gustaría ordenar el arraylist que obtengo después de aplicar el calculo correspondiente según el campo savings, pero no se cómo hacerlo.

La clase esta estructurada así:
Código:
import java.util.ArrayList;
	
public class EdgeSavings 
	{
	    /* INSTANCE FIELDS & CONSTRUCTOR */
		private Node depot;
	    private Node customer1;
	    private Node customer2; 
	    private double costs = 0.0; // edge costs
	    private double savings = 0.0; // edge savings (Clarke & Wright)
	    private Route inRoute = null; // route containing this edge (0 if no route assigned)
	    private Edge inverseEdge = null; // edge with inverse direction
	            
	    public EdgeSavings(Node d, Node c1, Node c2) 
	    {   depot=d;
	    	customer1 = c1;
	        customer2 = c2;
	    }

	    /* SET METHODS */
	    public void setCosts(double c){costs = c;}
	    public void setSavings(double s){savings = s;}
	    public void setInRoute(Route r){inRoute = r;}
	    public void setInverse(Edge e){inverseEdge = e;}

	    /* GET METHODS */
	    public Node getDepot(){return depot;}
	    public Node getCustomer1(){return customer1;}
	    public Node getCustomer2(){return customer2;}
	    public double getCosts(){return costs;}
	    public double getSavings(){return savings;}
	    public Route getInRoute(){return inRoute;}
	    public Edge getInverseEdge(){return inverseEdge;}
	}
He buscado en google y he visto que usan algo como esto:
@Override
public int compareTo(Fruit fruit) {
//write code here for compare name
}
pero la verdad no entiendo muy bien como se compara usando eso... ni tampoco como usarlo dentro de mi código...

Gracias y un saludo!!
__________________
Going hard for too long... Can't get enough
  #2 (permalink)  
Antiguo 10/07/2015, 06:18
Avatar de Tipdar  
Fecha de Ingreso: octubre-2005
Ubicación: Aquí y allá.
Mensajes: 323
Antigüedad: 18 años, 5 meses
Puntos: 7
Respuesta: Ordenar ArrayList

Ante todo te saludo, maiksix!

En efecto, tienes que redefinir el método compareTo(). En realidad es sólo una de las vías (muy cómoda por cierto), pero ya que andas por esa línea te diré cómo hacerlo.

Lo primero es que a tu clase EdgeSavings tiene que implementar la interfaz Comparable. Cómo es genérica te quedaría algo así:

Código PHP:
public class EdgeSavings implements Comparable<EdgeSavings> {
...

Nada complicado ¿eh? Tienes, fíjate bien, TIENES, no debes, tienes entonces que redefinir el método compareTo(Object). En tu caso, y teniendo presente que lo estamos haciendo genérico y que el atributo savings es de tipo double sería:

Código PHP:
public int compareTo(EdgeSavings edge)  {
    if (
this.savings edge.getSavings())
       return -
1;
    if (
this.savings edge.getSavings())
       return 
1;
    return 
0;

¿Qué acabo de hacer? Le estoy diciendo cómo debe ordenar tu ArrayList (tu Collection). Lo he puesto así, a lo pavote para que comprendas cómo funciona esto. Al compareTo le pasas un objeto de tu misma clase, y comparas tu objeto (nota los this) con el otro objeto (edge) que le pasas como parámetro. Te devuelve 1 si el objeto a comparar es mayor, -1 si es menor y 0 si son iguales. En ese método le dices cómo comparar. En este caso, porque solo quieres ordenar, tú mismo nunca vas a invocar directamente al método compareTo.

Ya lo otro es sencillo. Una vez lleno tu ArrayList con objetos EdgeSavings invocas esto:

Código PHP:
List<EdgeSavingsmiLista = new ArrayList<EdgeSavings>();

miLista.add(...); 

// todos los objetos

Collections.sort(miLista); 
El método sort de la clase Collections ordenará el ArrayList para ti, pero ya sabe cómo comparar, porque se lo has dicho en la redefinición del método compareTo.

Espero te sirva.
__________________
El último TipdaR

Última edición por Tipdar; 10/07/2015 a las 06:47

Etiquetas: arraylist, clase
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:34.