Foro sobre Java SE > Ayuda, como ordenar arreglo de objetos :)
"... debe ser en arreglo,no con "array""
Para poder entenderte, procura denominarlo en Java: ¿qué clase es ese "arreglo"?
Por otra parte, hace falta saber el tipo que contiene: no basta con decir "... cada objeto tiene un String nombre". ¿Qué es ese objeto?.
¿Tanto cuesta explicarse con detalle?
Holi, gracias por contestarme, mira, mi arreglo es el siguiente:
public class Vector {
public static void main(String[] args) {
Nombres arreglo [] = new Nombres[3];
Nombres def = new Nombres();
def.setNombre("Eliza");
def.setApellido("Escalante");
arreglo[0]=def;
Nombres def2 = new Nombres();
def2.setNombre("Maritza");
def2.setApellido("Proaño");
arreglo[1]=def2;
Nombres def3 = new Nombres();
def3.setNombre("Sivia");
def3.setApellido("Almeida");
arreglo[2]=def;
}
}
y mi clase "Nombres" es la siguiente:
class Nombres {
public String nombre;
public String apellido;
public String getNombre() {
return nombre;}
public void setNombre(String nombre) {
this.nombre = nombre;}
public String getApellido() {
return apellido;}
public void setApellido(String apellido) {
this.apellido = apellido;}
}
lo que intento hacer es un metodo que ordene por apellido los 3 elementos de mi arreglo, osea q muestre los 3 elementos en forma alfabetica por apellido, mm no digo que me den aciendo si no que me expliken como acer, gracias
Correcion:
al asignar arreglo[2]=def; , debe ser arreglo[2]=def3;
se me escapo eso, ahora si esta el codigo:)
Primero tienes que corregir los errores en tu codigo.
Por ejemplo tienes:
arreglo[2]=def;
Cuando debería ser
arreglo[2]=def3;
Por otro lado Nombres no encapsula los atributos, que has declarado como públicos.
Respecto a lo de ordenar, una forma rápida sería que tu clase Nombres implemente Comparable (implements Comparable) y sobreescribas el método compareTo
@Override
public int compareTo(Object o) {
if (this.getApellido() != null) {
return this.getApellido().compareTo(((Nombres)o).getApellido());
}
return 0;
}
Una vez hecho esto, solo tienes que hacer esto en el main para que se ordene el array (o arreglo, que son exactamente lo mismo):
Arrays.sort(arreglo);
Un saludo
Ah, ya veo que lo del def3 lo has puesto en el anterior post. Olvídalo entonces.
*_* muchas gracias , ya reviso elcodigo, si tengo otra duda los molesto de nuevo:O , gracias
Con el método sort de la clase Arrays puedes ordenar lo que quieras, en cualquier momento, declarando un Comparator como argumento.
http://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#sort-T:A-java.util.Comparator-
public class NewMain {
/**
@param args the command line arguments
*/
public static void main(String[] args) {
Nombres[] nombres = new Nombres[3];
Nombres def = new Nombres();
def.setNombre("Eliza");
def.setApellido("Escalante");
nombres[0] = def;
Nombres def2 = new Nombres();
def2.setNombre("Maritza");
def2.setApellido("Proaño");
nombres[1] = def2;
Nombres def3 = new Nombres();
def3.setNombre("Sivia");
def3.setApellido("Almeida");
nombres[2] = def3;
Arrays.sort(nombres, new Comparator<Nombres>() {
@Override
public int compare(Nombres o1, Nombres o2) {
return o1.getApellido().compareTo(o2.getApellido());
}
});
for (Nombres nombre : nombres) {
System.out.println(MessageFormat.format("{0} {1}", nombre.getNombre(), nombre.getApellido()));
}
}
}
public class Nombres {
private String nombre;
private String apellido;
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getApellido() {
return apellido;
}
public void setApellido(String apellido) {
this.apellido = apellido;
}
}
Grcias por ayudarme,mmm y si no es mucha molestia, podrias explicarme que hace cada linea del codgio debajo de @Override ?? porfavor?
La clase Comparator:
http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html
Un excelente tutorial sobre el tema en cuestión:
http://tutorials.jenkov.com/java-collections/sorting.html
Gracias por larespuesta, pero tengo una duda, tengo una clases solo para los get y set,otra clases para el los elementos delarreglo, y por ultimo la clase main solo para llamar a las clases antes mencionadas, mmm en q clase pongo el codigo de ordenar? y como lollamo?? :O
Puedes usar un método como éste, que añades a la clase que prefieras, por ejemplo esa clase que tienes para el Nombres[]
public void ordenarApellidos(Nombres nombres){
Arrays.sort(nombres, new Comparator<Nombres>() {
@Override
public int compare(Nombres o1, Nombres o2) {
return o1.getApellido().compareTo(o2.getApellido());
}
});
}
Gracias por contestar, tengo un problema, espero me puedas ayudar con esto por que solo esto me falta y no se mucho de java aun ,te explico detalladamente y al final adjunto el código si no es mucha molestia :
Pues si funciona para ordenar los elementos previamente cargados en el arreglo, pero si yo cambio el tamaño del arreglo a 6 elementos, luego creo un método para poder ingresar un elemento al arreglo, (los 3 cargados previamente ya están ingresados), al llamar al método "ordenar" salen muchos errores :O he leído mucho en Internet pero no encuentro una solución a esto, para ser mas precisa, adjunto el código:
MI CLASE MAIN:
package vector;
import java.util.Arrays;
import java.util.Comparator;
public class Vector {
public static void main(String[] args) {
Arreglo t = new Arreglo ();}}
-------------------------------------------------------------
MI CLASE ARREGLO:
package vector;
import java.util.Arrays;
import java.util.Comparator;
import javax.swing.JOptionPane;
public class Arreglo {
Nombres[] nombres = new Nombres[6];
int opc = 0;
int posicion = 0 ;
public Arreglo(){
// AKI DEFINO LOS 3 ELEMENTOS YA CARGADOS EN EL VECTOR
Nombres def = new Nombres();
def.setNombre("Eliza");
def.setApellido("Escalante");
def.setTelefono(343);
nombres[0] = def;
posicion++;
Nombres def2 = new Nombres();
def2.setNombre("Maritza");
def2.setApellido("Proaño");
def2.setTelefono(745);
nombres[1] = def2;
posicion++;
Nombres def3 = new Nombres();
def3.setNombre("Sivia");
def3.setApellido("Almeida");
def3.setTelefono(234);
nombres[2] = def3;
posicion++;
//AKI PIDO QUE EL USUARIO INGRESE LA OPCION
do {
String a = JOptionPane.showInputDialog(null, "Ingrese 1 para ingresar, 2 para ordenar, 3 para mostrar , 4 para salir");
opc= Integer.parseInt(a);
switch (opc){
case 1:
ingresar();
break;
case 2:
ordenar();
break;
case 3:
mostrar();
break;
case 4:
salir();
}}
while(opc!=4);
}
// METODO PARA INGRESAR UN ELEMENTO
public void ingresar(){
String nombre;
String apellido;
String telefget;
int telefono;
nombre = JOptionPane.showInputDialog(null, "Ingrese el Nombre del usuario: ");
apellido = JOptionPane.showInputDialog(null, "Ingrese el Apellido del usuario: ");
telefget = JOptionPane.showInputDialog(null, "Ingrese el Telefono del Usuario: ");
telefono = Integer.parseInt(telefget);
Nombres prev = new Nombres();
prev.setNombre(nombre);
prev.setApellido(apellido);
prev.setTelefono(telefono);
nombres [posicion] = prev;
posicion++;
}
//METODO PARA MOSTRAR
public void mostrar(){
String vector="";
for(int i=0; i<posicion; i++){
vector+="Nombre: "+nombres[i].getNombre()+"\n"
+ "Apellido: "+nombres[i].getApellido()+"\n"
+ "Telefono: "+nombres[i].getTelefono()+"\n";
}
JOptionPane.showMessageDialog(null, vector);
}
// METODO PARA ORDENAR
public void ordenar () {
Arrays.sort(nombres, new Comparator<Nombres>() {
@Override
public int compare(Nombres o1, Nombres o2) {
return o1.getApellido().compareTo(o2.getApellido());
}
});
for (Nombres nombre : nombres) {
JOptionPane.showMessageDialog(null, ""+nombre.getNombre()+nombre.getApellido());
}
}
// METODO PARA SALIR
public void salir (){
JOptionPane.showMessageDialog(null, "Ha salidodelprograma");
System.exit(0);
}
}
Bueno espero que alguien pueda ayudarme, y ojala no sea mucho abuso,espero sus respuestas, gracias :D
El problema es que declaras Nombres[] nombres = new Nombres[6];
sin embargo solo inicializas 3 nombres al principio, luego las tres posiciones restantes del array son null.
Cuando ingresas un nuevo nombre, la posición 4 contiene ese nuevo nombre, pero las dos restantes siguen siendo null.
Por esa razón te lanza todos esos NullPointerException. Es el problema habitual al trabajar con arrays.
Sigue la clase corregida para evitarlos; pero deberías empezar a pensar en usar List en vez de arrays.
import java.util.Arrays;
import java.util.Comparator;
import javax.swing.JOptionPane;
public class Arreglo {
Nombres[] nombres = new Nombres[6];
int opc = 0;
int posicion = 0;
public Arreglo() {
// AKI DEFINO LOS 3 ELEMENTOS YA CARGADOS EN EL VECTOR
Nombres def = new Nombres();
def.setNombre("Eliza");
def.setApellido("Escalante");
def.setTelefono(343);
nombres[0] = def;
posicion++;
Nombres def2 = new Nombres();
def2.setNombre("Maritza");
def2.setApellido("Proaño");
def2.setTelefono(745);
nombres[1] = def2;
posicion++;
Nombres def3 = new Nombres();
def3.setNombre("Sivia");
def3.setApellido("Almeida");
def3.setTelefono(234);
nombres[2] = def3;
posicion++;
//AKI PIDO QUE EL USUARIO INGRESE LA OPCION
do {
String a = JOptionPane.showInputDialog(null, "Ingrese 1 para ingresar, 2 para ordenar, 3 para mostrar , 4 para salir");
opc = Integer.parseInt(a);
switch (opc) {
case 1:
ingresar();
break;
case 2:
ordenar();
break;
case 3:
mostrar();
break;
case 4:
salir();
}
} while (opc != 4);
}
// METODO PARA INGRESAR UN ELEMENTO
public void ingresar() {
String nombre;
String apellido;
String telefget;
int telefono;
nombre = JOptionPane.showInputDialog(null, "Ingrese el Nombre del usuario: ");
apellido = JOptionPane.showInputDialog(null, "Ingrese el Apellido del usuario: ");
telefget = JOptionPane.showInputDialog(null, "Ingrese el Telefono del Usuario: ");
telefono = Integer.parseInt(telefget);
Nombres prev = new Nombres();
prev.setNombre(nombre);
prev.setApellido(apellido);
prev.setTelefono(telefono);
nombres[posicion] = prev;
posicion++;
}
//METODO PARA MOSTRAR
public void mostrar() {
String vector = "";
for (int i = 0; i < posicion; i++) {
if (nombres[i] != null) {
vector += "Nombre: " + nombres[i].getNombre() + "\n"
+ "Apellido: " + nombres[i].getApellido() + "\n"
+ "Telefono: " + nombres[i].getTelefono() + "\n";
}
}
JOptionPane.showMessageDialog(null, vector);
}
// METODO PARA ORDENAR
public void ordenar() {
Arrays.sort(nombres, new Comparator<Nombres>() {
@Override
public int compare(Nombres o1, Nombres o2) {
if (o1 != null && o2 != null) {
return o1.getApellido().compareTo(o2.getApellido());
} else {
return -1;
}
}
});
for (Nombres nombre : nombres) {
if (nombre != null) {
JOptionPane.showMessageDialog(null, "" + nombre.getNombre() + nombre.getApellido());
}
}
}
// METODO PARA SALIR
public void salir() {
JOptionPane.showMessageDialog(null, "Ha salidodelprograma");
System.exit(0);
}
}
Oli, no se como ordenar un arreglo compuesto de objetos, cada objeto tiene un String nombre ,me pueden ayudar por favor?? o me pueden guiar en que sitio encuentro informacion sobre eso?? gracias, x sierto, debe ser en arreglo,no con "array" ,gracias :)