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

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

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:

"Paco, Paco, Paco"

o_O

Para este caso específico ( buscar en una lista de 20 elementos ) una búsqueda lineal basta

for ( Persona p : lista ) {
    if ( nombre == null ? p.getNombre() == null : nombre.equals( p.getNombre ) ) {
     /// agregarlo al string
     stringBuffer.append( nombre );
    }
}
return stringBuffer;
Imagen de chicowed

Problemita

Tengo el siguiente problemita, estoy tratando de regresar a todas las personas mayores de edad con lo cual implemento el siguiente metodo

    public String mayoresEdad() {
        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 :/

Imagen de chicowed

Codigo completo

Muestro el codigo para ver en que puedo estar mal

Clase Persona

package 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.ArrayList;
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

package persona;

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.)

   public String mayoresEdad() {
        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";
}
    }
Imagen de chicowed

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.

ejemplo

Imagen de chicowed

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 ??????

Imagen de adrianaaae

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) {...

Imagen de chicowed

Así quedo :)

    public String buscarPaterno(String paterno) {
        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

 public String buscarPaterno(String paterno) {
        StringBuffer personas = new StringBuffer("");
        for(Persona p: datos) {
            if(p.getApellidoPaterno().equals(paterno)) {
                personas.append(p.toString());
            }
        }
        return personas.toString;
    }
Imagen de chicowed

Gracias

Muchas gracias mi estimado lo tomare en cuenta :)

Imagen de SuperSerch

Si estas en Java 8

Puedes usar un stream:

public String buscarPaterno(String paterno) {
    return datos.stream()
        .filter(p -> p.getApellidoPaterno().equals(paterno))
        .map(p -> p.toString())
        .collect(Collectors.joining(", "));
}
Imagen de chicowed

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.

Imagen de ezamudio

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

lambda

~~~

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