Como imprimir ArrayList Orden Alfabético????
Tengo un ArrayList implementado en mi programa, pero lo que se me pide y no se como puedo hacer es, imprimir el comtenido del mismo en orden alfabético.
El contenido de este se introduce por teclado cada vez que el programa es ejecutado; y lo que son estructuras del tipo Persona que implementan Comparable, bien pues, hecho esto que es lo que tengo, mi programa lo que hace es imprimir por pantalla el contenido del ArrayList pero en el orden que han sido introducidos, y lo que se me pide es que su salida por pantalla sea alfabética en funcion del nombre de la persona, alguien por favor podría ayudarme a encaminar o a hacer esta parte de mi practica que no entiendo como puedo realizar????
PD:
Os adjunto el código de mi practica por si quereis mirar como la he hecho y decirme si cambiaríais algo de lo puesto o por el contrario la dejaríais tal cual y, me digais por favor como se hace esto de la ordenación alfabética.
Por último explicar que el profesor explico dos métodos alternativos de ordenación, pero que no logro usarlos adecuadamente y son los siguientes:
a) Hacer una cópia de List a SortedList, y recorrer el SortedList.
b) Usar Collections.sort(List l);
DECIDME SOBRETODO POR FAVOR LO DE LA ORDENACIÓN ALFABÉTICA QUE ES LO QUE MÁS PRISA ME CORRE. GRACIAS!!!!!
Sin más os adjunto mi código que buenamente he podido implementar:
Mi clase métodos de manipulación:
package InterfacesYCollections;
import java.util.*;
public class MetodosDeManipulacion {
//////////////////////////////////////////////////////////////////////////////
//Metodos de Manipulación a los cuales se accederá segun la opción escogida.//
//////////////////////////////////////////////////////////////////////////////
//Manipulación de Vectores.
public void List(List arrayListPersonas) {
int i = 0;
while (i < arrayListPersonas.size()) {
//Impresión por pantalla del contenido de cada campo del vector vectorPersonas().
System.out.print(arrayListPersonas.get(i).toString());
i++;
}
}
//Manipulación de HashTables.
public void Map(Map personas) throws Exception {
String nombre, apellido;
do {
System.out.print("Introduzca un nombre a localizar: ");
nombre = libreria.leerCadena();
System.out.print("Introduzca un apellido a localizar: ");
apellido = libreria.leerCadena();
if (personas.containsKey(nombre + apellido)) {
System.out.println(personas.get(nombre + apellido));
}
if (!personas.containsKey(nombre + apellido) &&
(nombre.length() != 0)) {
//System.out.print("n***Nombre introducido es: " + nombre + " y su longitud es de: " + nombre.length() + "n");
System.out.println("nError, Persona no encontrada.");
}
//System.out.print("n***Nombre introducido es: " + nombre + " y su longitud es de: " + nombre.length() + "n");
} while (nombre.length() != 0);
System.out.print("nFin del Programa.");
}
}
Mi clase Persona:
package InterfacesYCollections;
import java.io.*;
abstract class Persona {
//Atributos de la persona.
private String nombre;
private String apellido;
private int edad;
public int edadMinima = 999;
public int edadMaxima = 0;
//Metodos de la clase persona.
public Persona() {
String nombre, apellido;
int edad;
}
public Persona(String nombre, String apellido, int edad) {
this.nombre = nombre;
this.apellido = apellido;
this.edad = edad;
}
public String toString() {
return "nNombre y Apellido: " + nombre + " " + apellido +
" Edad: " + edad;
}
public void setEdadMinima(int edad) {
this.edadMinima = edad;
}
public int getEdadMinima() {
return edadMinima;
}
public String getNombre() {
return nombre;
}
public void setEdadMaxima(int edad) {
this.edadMaxima = edad;
}
public int getEdadMaxima() {
return edadMaxima;
}
public void setEdad(int edad) {
this.edad = edad;
}
public int getEdad() {
return edad;
}
public void mostrarEdadesExtremas() {
System.out.print("nnEdad Maxima: " + this.edadMaxima);
System.out.print("nEdad Minima: " + this.edadMinima);
}
}
Mi clase PersonaComparable:
package InterfacesYCollections;
class PersonaComparable extends Persona implements Comparable {
public PersonaComparable() {
super();
}
public PersonaComparable(String nombre, String apellido, int edad) {
super(nombre, apellido, edad);
}
public int compareTo(Persona pers) {
if (this.getNombre().compareTo(pers.getNombre()) == 0) {
return 0;
}
if (this.getNombre().compareTo(pers.getNombre()) < 0) {
return -1;
}
return 1;
}
public int compareTo(Object o) {
return 0;
}
}
Mi clase principal Practica7:
package InterfacesYCollections;
import java.util.*;
import java.util.SortedSet;
public class Practica7 {
public static void main(String[] args) throws Exception {
MetodosDeManipulacion mdm = new MetodosDeManipulacion();
TreeSet ts;
//Declaración de variables.
PersonaComparable p = new PersonaComparable();
String nombre, apellido;
int edad, i = 0;
//Construcción de la nueva instancia del vector.
List arrayListPersonas = new ArrayList();
Map personas = new HashMap();
do {
//Entrada de datos.
System.out.print("Introducir nombre: ");
nombre = libreria.leerCadena();
//Si el nombre introducido por el usuario está vacio se salta directamente los otros 2 campos de la estructura Persona.
if (nombre.compareTo("") != 0) {
System.out.print("Introducir apellido: ");
apellido = libreria.leerCadena();
System.out.print("Introducir edad: ");
edad = libreria.leerEntero();
///////////////////////////////////////////////////////////////////////
//Muestra de las edades mínima y máxima.
if (edad < p.getEdadMinima()) {
p.setEdadMinima(edad);
}
if (edad > p.getEdadMaxima()) {
p.setEdadMaxima(edad);
}
///////////////////////////////////////////////////////////////////////
//Construcción de la nueva clase arrayListPersonas de tipo List con los datos introducidos.
arrayListPersonas.add(new PersonaComparable(nombre, apellido,
edad));
//Construcción de la nueva clase personas de tipo HashMap con los datos introducidos.
personas.put(nombre + apellido,
new PersonaComparable(nombre, apellido, edad));
}
} while (nombre.compareTo("") != 0);
////////////////////////////////////////////////////////////////////////
//Decisión HashTable o Vector.
System.out.print("nnQue desea usar HashMap o ArrayList???");
char respuesta = libreria.leerCaracter();
if (respuesta == 'H' || respuesta == 'h') {
mdm.Map(personas);
}
if (respuesta == 'A' || respuesta == 'a') {
//Muestra lista desordenada.
System.out.print("nDesordenadon");
mdm.List(arrayListPersonas);
ts = new TreeSet(arrayListPersonas);
Iterator a = ts.iterator();
//Muestra lista ordenada.
System.out.print("nOrdenadon");
/*Imprimir el sort por pantalla y ya está*/ Collections.sort(arrayListPersonas);
}
p.mostrarEdadesExtremas();
}
}
Espero que el código os sirva de algo, perdón por las molestias, y gracias por adelantado por la ayuda.
Thanks!!!!!
El contenido de este se introduce por teclado cada vez que el programa es ejecutado; y lo que son estructuras del tipo Persona que implementan Comparable, bien pues, hecho esto que es lo que tengo, mi programa lo que hace es imprimir por pantalla el contenido del ArrayList pero en el orden que han sido introducidos, y lo que se me pide es que su salida por pantalla sea alfabética en funcion del nombre de la persona, alguien por favor podría ayudarme a encaminar o a hacer esta parte de mi practica que no entiendo como puedo realizar????
PD:
Os adjunto el código de mi practica por si quereis mirar como la he hecho y decirme si cambiaríais algo de lo puesto o por el contrario la dejaríais tal cual y, me digais por favor como se hace esto de la ordenación alfabética.
Por último explicar que el profesor explico dos métodos alternativos de ordenación, pero que no logro usarlos adecuadamente y son los siguientes:
a) Hacer una cópia de List a SortedList, y recorrer el SortedList.
b) Usar Collections.sort(List l);
DECIDME SOBRETODO POR FAVOR LO DE LA ORDENACIÓN ALFABÉTICA QUE ES LO QUE MÁS PRISA ME CORRE. GRACIAS!!!!!
Sin más os adjunto mi código que buenamente he podido implementar:
Mi clase métodos de manipulación:
package InterfacesYCollections;
import java.util.*;
public class MetodosDeManipulacion {
//////////////////////////////////////////////////////////////////////////////
//Metodos de Manipulación a los cuales se accederá segun la opción escogida.//
//////////////////////////////////////////////////////////////////////////////
//Manipulación de Vectores.
public void List(List arrayListPersonas) {
int i = 0;
while (i < arrayListPersonas.size()) {
//Impresión por pantalla del contenido de cada campo del vector vectorPersonas().
System.out.print(arrayListPersonas.get(i).toString());
i++;
}
}
//Manipulación de HashTables.
public void Map(Map personas) throws Exception {
String nombre, apellido;
do {
System.out.print("Introduzca un nombre a localizar: ");
nombre = libreria.leerCadena();
System.out.print("Introduzca un apellido a localizar: ");
apellido = libreria.leerCadena();
if (personas.containsKey(nombre + apellido)) {
System.out.println(personas.get(nombre + apellido));
}
if (!personas.containsKey(nombre + apellido) &&
(nombre.length() != 0)) {
//System.out.print("n***Nombre introducido es: " + nombre + " y su longitud es de: " + nombre.length() + "n");
System.out.println("nError, Persona no encontrada.");
}
//System.out.print("n***Nombre introducido es: " + nombre + " y su longitud es de: " + nombre.length() + "n");
} while (nombre.length() != 0);
System.out.print("nFin del Programa.");
}
}
Mi clase Persona:
package InterfacesYCollections;
import java.io.*;
abstract class Persona {
//Atributos de la persona.
private String nombre;
private String apellido;
private int edad;
public int edadMinima = 999;
public int edadMaxima = 0;
//Metodos de la clase persona.
public Persona() {
String nombre, apellido;
int edad;
}
public Persona(String nombre, String apellido, int edad) {
this.nombre = nombre;
this.apellido = apellido;
this.edad = edad;
}
public String toString() {
return "nNombre y Apellido: " + nombre + " " + apellido +
" Edad: " + edad;
}
public void setEdadMinima(int edad) {
this.edadMinima = edad;
}
public int getEdadMinima() {
return edadMinima;
}
public String getNombre() {
return nombre;
}
public void setEdadMaxima(int edad) {
this.edadMaxima = edad;
}
public int getEdadMaxima() {
return edadMaxima;
}
public void setEdad(int edad) {
this.edad = edad;
}
public int getEdad() {
return edad;
}
public void mostrarEdadesExtremas() {
System.out.print("nnEdad Maxima: " + this.edadMaxima);
System.out.print("nEdad Minima: " + this.edadMinima);
}
}
Mi clase PersonaComparable:
package InterfacesYCollections;
class PersonaComparable extends Persona implements Comparable {
public PersonaComparable() {
super();
}
public PersonaComparable(String nombre, String apellido, int edad) {
super(nombre, apellido, edad);
}
public int compareTo(Persona pers) {
if (this.getNombre().compareTo(pers.getNombre()) == 0) {
return 0;
}
if (this.getNombre().compareTo(pers.getNombre()) < 0) {
return -1;
}
return 1;
}
public int compareTo(Object o) {
return 0;
}
}
Mi clase principal Practica7:
package InterfacesYCollections;
import java.util.*;
import java.util.SortedSet;
public class Practica7 {
public static void main(String[] args) throws Exception {
MetodosDeManipulacion mdm = new MetodosDeManipulacion();
TreeSet ts;
//Declaración de variables.
PersonaComparable p = new PersonaComparable();
String nombre, apellido;
int edad, i = 0;
//Construcción de la nueva instancia del vector.
List arrayListPersonas = new ArrayList();
Map personas = new HashMap();
do {
//Entrada de datos.
System.out.print("Introducir nombre: ");
nombre = libreria.leerCadena();
//Si el nombre introducido por el usuario está vacio se salta directamente los otros 2 campos de la estructura Persona.
if (nombre.compareTo("") != 0) {
System.out.print("Introducir apellido: ");
apellido = libreria.leerCadena();
System.out.print("Introducir edad: ");
edad = libreria.leerEntero();
///////////////////////////////////////////////////////////////////////
//Muestra de las edades mínima y máxima.
if (edad < p.getEdadMinima()) {
p.setEdadMinima(edad);
}
if (edad > p.getEdadMaxima()) {
p.setEdadMaxima(edad);
}
///////////////////////////////////////////////////////////////////////
//Construcción de la nueva clase arrayListPersonas de tipo List con los datos introducidos.
arrayListPersonas.add(new PersonaComparable(nombre, apellido,
edad));
//Construcción de la nueva clase personas de tipo HashMap con los datos introducidos.
personas.put(nombre + apellido,
new PersonaComparable(nombre, apellido, edad));
}
} while (nombre.compareTo("") != 0);
////////////////////////////////////////////////////////////////////////
//Decisión HashTable o Vector.
System.out.print("nnQue desea usar HashMap o ArrayList???");
char respuesta = libreria.leerCaracter();
if (respuesta == 'H' || respuesta == 'h') {
mdm.Map(personas);
}
if (respuesta == 'A' || respuesta == 'a') {
//Muestra lista desordenada.
System.out.print("nDesordenadon");
mdm.List(arrayListPersonas);
ts = new TreeSet(arrayListPersonas);
Iterator a = ts.iterator();
//Muestra lista ordenada.
System.out.print("nOrdenadon");
/*Imprimir el sort por pantalla y ya está*/ Collections.sort(arrayListPersonas);
}
p.mostrarEdadesExtremas();
}
}
Espero que el código os sirva de algo, perdón por las molestias, y gracias por adelantado por la ayuda.
Thanks!!!!!
Para implementar correctemente el método de comparación en la última versión de Java se debería hacer escribir donde se define la clase PersonaComprable implements Comparable<? extends Personae>
public int compareTo(? extends Persona otraPersona)
{
int valor=apellido.compareTo(otraPersona.apellido);
if(valor==0)
valor=nombre.compareTo(otraPersona.nombre);
return valor;
}
Supongo que ordenarás en primer lugar por el apellido y luego por el nombre. Si sólo deseas hacerlo por el nombre entonces el método compareTo lo único que debe hacer es devolver el valor de la comparación de los nombres, este y el del objeto pasado como parámetro y si desas comparar también la edad añádele al if unos paréntesis y después de la asignación, haz
if(valor==0)
valor=edad-otraPersona.edad;
Para ordenar la lista, efectivamente utiliza el método java.util.Collections.sort(lista);
public int compareTo(? extends Persona otraPersona)
{
int valor=apellido.compareTo(otraPersona.apellido);
if(valor==0)
valor=nombre.compareTo(otraPersona.nombre);
return valor;
}
Supongo que ordenarás en primer lugar por el apellido y luego por el nombre. Si sólo deseas hacerlo por el nombre entonces el método compareTo lo único que debe hacer es devolver el valor de la comparación de los nombres, este y el del objeto pasado como parámetro y si desas comparar también la edad añádele al if unos paréntesis y después de la asignación, haz
if(valor==0)
valor=edad-otraPersona.edad;
Para ordenar la lista, efectivamente utiliza el método java.util.Collections.sort(lista);
Gracias, práctica solucionada, en caso de duda, siempre sabré donde acudir.