Coleccion de objetos ordenada
Hola a todos.
Tengo que guardar una coleccion de objetos y estos han de estar ordenados por un campo entero. Que componente me recomendais? Bueno, me da igual que en el lugar donde los guarde esten ordenados o no. Lo que quiero es que segun los vaya pidiendo, me los vaya dando en orden. A priori no sabria la clave, por lo que no puedo usar una tabla hash. Seria con un iterador, pero no se que componenete me los puede servir en el lugar que los fui insertando.
Gracias
Tengo que guardar una coleccion de objetos y estos han de estar ordenados por un campo entero. Que componente me recomendais? Bueno, me da igual que en el lugar donde los guarde esten ordenados o no. Lo que quiero es que segun los vaya pidiendo, me los vaya dando en orden. A priori no sabria la clave, por lo que no puedo usar una tabla hash. Seria con un iterador, pero no se que componenete me los puede servir en el lugar que los fui insertando.
Gracias
Por favor señores, no reinventemos la rueda.
La clase debe implementar Comparable o tener un Comparator para poder ordenarlos.
1) Te guardas los objetos en un Vector o ArrayList. Cuando los quieras recuperar ordenados, utiliza Collections.sort(...)
2) Utiliza un TreeMap, que los mantiene internamente ordenados y utiliza una clase. Si no tiene una clave para darle al Map, utiliza el campo por el que ordenas, siempre y cuando éste sea univoco.
La clase debe implementar Comparable o tener un Comparator para poder ordenarlos.
1) Te guardas los objetos en un Vector o ArrayList. Cuando los quieras recuperar ordenados, utiliza Collections.sort(...)
2) Utiliza un TreeMap, que los mantiene internamente ordenados y utiliza una clase. Si no tiene una clave para darle al Map, utiliza el campo por el que ordenas, siempre y cuando éste sea univoco.
public class QuickSort {
public static void quicksort(Puntos[] a,int large) {
quicksort(a, 0, large - 1);
}
public static void quicksort(Puntos[] a, int left, int right) {
if (right <= left) return;
int i = partition(a, left, right);
quicksort(a, left, i-1);
quicksort(a, i+1, right);
}
public static int partition(Puntos[] a, int left, int right) {
int i = left - 1;
int j = right;
while(true) {
// find item on left to swap
while (less(a[++i].cordx, a[right].cordx))
;
// find item on right to swap
while (less(a[right].cordx, a[--j].cordx))
if (j == left) break;
// check if pointers cross
if (i >= j) break;
exch(a, i, j);
}
// swap with partition element
exch(a, i, right);
return i;
}
// es x < y ?
public static boolean less(int x, int y) {
return (x < y);
}
// cambiando a[i] and a[j]
static void exch(Puntos[] a, int i, int j) {
int swap = a[i].cordx;
a[i].cordx = a[j].cordx;
a[j].cordx = swap;
int swapy = a[i].cordy;
a[i].cordy = a[j].cordy;
a[j].cordy = swapy;
}
}
Esta clase una vez la implemente, ya que tenia un conjunto de objetos puntos y ademas en el guardaba coordenadas x e y, pero como la inserccion era de forma aleatoria no sabia como ordenarlos, pero ya una vez ingresados solo colocaba el campo por el cual fueran ordenados y ya esta, en todo caso te envio la clase Puntos para que puedas comprender el funcionamiento de esta misma:
public class Puntos{
int x;
int y;
public Puntos(int x, int y){
this.x=x;
this.y=y;
}
}
Espero que puedas sacar provecho a la presente clase y sus metodos....
Atentamente
rolextreme
public static void quicksort(Puntos[] a,int large) {
quicksort(a, 0, large - 1);
}
public static void quicksort(Puntos[] a, int left, int right) {
if (right <= left) return;
int i = partition(a, left, right);
quicksort(a, left, i-1);
quicksort(a, i+1, right);
}
public static int partition(Puntos[] a, int left, int right) {
int i = left - 1;
int j = right;
while(true) {
// find item on left to swap
while (less(a[++i].cordx, a[right].cordx))
;
// find item on right to swap
while (less(a[right].cordx, a[--j].cordx))
if (j == left) break;
// check if pointers cross
if (i >= j) break;
exch(a, i, j);
}
// swap with partition element
exch(a, i, right);
return i;
}
// es x < y ?
public static boolean less(int x, int y) {
return (x < y);
}
// cambiando a[i] and a[j]
static void exch(Puntos[] a, int i, int j) {
int swap = a[i].cordx;
a[i].cordx = a[j].cordx;
a[j].cordx = swap;
int swapy = a[i].cordy;
a[i].cordy = a[j].cordy;
a[j].cordy = swapy;
}
}
Esta clase una vez la implemente, ya que tenia un conjunto de objetos puntos y ademas en el guardaba coordenadas x e y, pero como la inserccion era de forma aleatoria no sabia como ordenarlos, pero ya una vez ingresados solo colocaba el campo por el cual fueran ordenados y ya esta, en todo caso te envio la clase Puntos para que puedas comprender el funcionamiento de esta misma:
public class Puntos{
int x;
int y;
public Puntos(int x, int y){
this.x=x;
this.y=y;
}
}
Espero que puedas sacar provecho a la presente clase y sus metodos....
Atentamente
rolextreme
