Buscar objetos en un ArrayList
Buen día, el presente es para preguntarles cual es forma mas recomendada para hacer lo anterior, tengo una clase Persona, y creo un ArrayList con 20 objetos, los cuales tienen como los siguientes atributos, nombre, apellido, edad, y ahora lo que quiero es crear un método buscarPorNombre
el cual recibe un String y regresa un String con todas las personas que coinciden con el parámetro de entrada,
antes de venir aquí encontré varios métodos los cuales aparentemente funcionan, pero me gustaría saber cual es la manera mas optima.
Gracias
- Inicie sesión o regístrese para enviar comentarios
Tu método debería de regresar
Tu método debería de regresar una lista de personas no? Si regresas un String con las personas que coinciden, suponiendo que fueran 3 y el parámetro fuera "Paco" tu salida sería:
o_O
Para este caso específico ( buscar en una lista de 20 elementos ) una búsqueda lineal basta
if ( nombre == null ? p.getNombre() == null : nombre.equals( p.getNombre ) ) {
/// agregarlo al string
stringBuffer.append( nombre );
}
}
return stringBuffer;
Problemita
Tengo el siguiente problemita, estoy tratando de regresar a todas las personas mayores de edad con lo cual implemento el siguiente metodo
int age;
String mayores = "";
for(Persona a: datos) {
age = a.getEdad();
if(age >= 18) return mayores += a.toString();
}
return "No hay mayores de edad en la lista\n";
}
Pero nomas me regresa la primera persona mayor de edad :/
Codigo completo
Muestro el codigo para ver en que puedo estar mal
Clase Persona
import java.util.Iterator;
/**
*
* @author Josue
*/
public class Persona {
private String nombre;
private String apellidoPaterno;
private String apellidoMaterno;
private String calle;
private String colonia;
private String ciudad;
private int edad;
public Persona(String nombre, String apellidoPaterno, String apellidoMaterno, String calle, String colonia, String ciudad, int edad) {
this.nombre = nombre;
this.apellidoPaterno = apellidoPaterno;
this.apellidoMaterno = apellidoMaterno;
this.calle = calle;
this.colonia = colonia;
this.ciudad = ciudad;
this.edad = edad;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public void setApellidoPaterno(String apellidoPaterno) {
this.apellidoPaterno = apellidoPaterno;
}
public void setApellidoMaterno(String apellidoMaterno) {
this.apellidoMaterno = apellidoMaterno;
}
public void setCalle(String calle) {
this.calle = calle;
}
public void setColonia(String colonia) {
this.colonia = colonia;
}
public void setCiudad(String ciudad) {
this.ciudad = ciudad;
}
public void setEdad(int edad) {
this.edad = edad;
}
public String getNombre() {
return nombre;
}
public String getApellidoPaterno() {
return apellidoPaterno;
}
public String getApellidoMaterno() {
return apellidoMaterno;
}
public String getCalle() {
return calle;
}
public String getColonia() {
return colonia;
}
public String getCiudad() {
return ciudad;
}
public int getEdad() {
return edad;
}
@Override
public String toString() {
String aux="";
aux += "Nombre: " + nombre + " " +
apellidoPaterno + " " + apellidoMaterno + " "+
calle + " " + colonia + " " + ciudad + " " + edad;
return aux;
}
@Override
public boolean equals(Object O){
Persona a = (Persona) O;
return (this.nombre.equals(a.nombre) ||
this.apellidoPaterno.equals(a.apellidoPaterno) ||
this.apellidoMaterno.equals(a.apellidoMaterno)) ||
this.calle.equals(a.calle) ||
this.ciudad.equals(a.ciudad ) ||
this.colonia.equals(a.colonia) ||
this.edad==edad;
}
}
Clase prueba
import java.util.Scanner;
/**
*
* @author Josue
*/
public class Prueba {
private final ArrayList<Persona> datos;
public Prueba() {
datos = new ArrayList();
}
public void leeDatos() {
String name,paterno,materno,calle,colonia,ciudad;
int edad;
for (int i = 0; i < 3; i++) {
Scanner input = new Scanner(System.in);
System.out.println("Por favor introduce un Nombre: ");
name = input.nextLine();
System.out.println("Introduce el apellido Paterno: ");
paterno = input.nextLine();
System.out.println("Introduce el apellido Materno: ");
materno = input.nextLine();
System.out.println("Introduce una Calle: ");
calle = input.nextLine();
System.out.println("Introduce una Colinia: ");
colonia = input.nextLine();
System.out.println("Introduce una Ciudad: ");
ciudad = input.nextLine();
System.out.println("Introduce la edad: ");
edad = input.nextInt();
datos.add(new Persona(name,paterno,materno,calle,colonia,ciudad,edad));
}
}
public String buscarPaterno(String paterno) {
//Persona aux = new Persona(paterno,paterno,paterno,"","","",0);
for(Persona a: datos) {
if(paterno.equals(a.getApellidoPaterno())) return a.toString();
}
return "Persona no encontrada\n";
}
public String mayoresEdad() {
String mayores = "";
for(Persona a: datos) {
int age = a.getEdad();
if(age >= 18) return mayores += a.toString();
}
return "No hay mayores de edad en la lista\n";
}
public void allPeople() {
for(Persona a: datos) {
System.out.println(a.toString());
}
}
}
Clase main
public class Main {
public static void main(String[] args) {
Prueba p = new Prueba();
p.leeDatos();
System.out.println(p.buscarPaterno("Villegas"));
System.out.println(p.mayoresEdad());
System.out.println("");
p.allPeople();
}
}
No hagas return
Un detalle es que estas haciendo el return, en ese punto apenas encontraste al primero y le dices que se salga de la funcion.
Puedes hacer varias cosas:
Primero quita el return
1. crea un arreglo o un stringbuffer o algo donde puedas guardar los valores que requieres
2. al salir del ciclo verifica el count del objeto que llenaste
si el count es mayor a cero regresa lo que tengas que regresar ( string, el arreglo o lo que necesites.)
si el count es igual a cero regresa tu cadena de que no se encontro nada. (aunque creo que eso no deberia ir ahi si no fuera de la funcion validando lo que regresa pero bueeeee.)
int age;
String mayores = "";
for(Persona a: datos) {
age = a.getEdad();
if(age >= 18) mayores += a.toString();
}
if(mayores.length >0 ){ return mayores;}
else{
return "No hay mayores de edad en la lista\n";
}
}
Modificaciones
Que tal mi estimado pedroza, hice las modificaciones pero sigue en lo mismo :/
Esta raro
Pues con tu codigo funciona correctamente, si regresa los mayores de edad. El unico cambio que hice fue comentar la entrada de los apellidos y colonias. Pero con la modificacion en el metodo de personas mayores si los regresa.
Ese si
Ese si pero el otro no, el buscarPaterno, pero ya lo corregi mil gracias por tomarse su tiempo :)
¿y cual fue la solucion?
¿¿¿¿¿¿a final de cuentas ??????
Me imagino
Me imagino que utilizó la misma información que le habías proporcionado para el método anterior; ya que al encontrar el primer dato
en la lista el ciclo se rompe con el return por lo que si existen demás registros en la lista lo ignorará.
Entonces me imagino que usó lo mismo para el método de búsqueda
public String buscarPaterno(String paterno) {...
Así quedo :)
String personas = "";
for(Persona p: datos) {
if(p.getApellidoPaterno().equals(paterno)) {
personas += p.toString();
}
}
return personas;
}
Para concatenar un String en
Para concatenar un String en tiempo de ejecución es mejor utilizar StringBuffer que "+", ya que "+" esta diseñado para actuar en tiempo de compilación
StringBuffer personas = new StringBuffer("");
for(Persona p: datos) {
if(p.getApellidoPaterno().equals(paterno)) {
personas.append(p.toString());
}
}
return personas.toString;
}
Gracias
Muchas gracias mi estimado lo tomare en cuenta :)
Si estas en Java 8
Puedes usar un stream:
return datos.stream()
.filter(p -> p.getApellidoPaterno().equals(paterno))
.map(p -> p.toString())
.collect(Collectors.joining(", "));
}
En chino...
Muchas gracias, por ahora ese código se ve en chino para mi xD, pero seguiré avanzando y espero llegar a comprender dicha expresión.
WAT?
El
+
para concatenar Strings se compila a usar un StringBuilder, entonces es lo mismo. No veo cómo podría "actuar en tiempo de compilación".Re: en chino...
No es chino. ¡Es Java 8!
Por cierto, ▼ este libro sí que está en chino para entenderle. :-P
~~~
Se solía evitar usar el
Se solía evitar usar el operador + para concatenar Strings porque antes de Java 5 se creaba una instancia nueva. Ahora tiene el mismo desempeño que el StringBuilder