Error con char y métodos listas

Iniciado por Baal_30, 15 Marzo 2015, 01:49 AM

0 Miembros y 1 Visitante están viendo este tema.

PabloPbl

^^ exactamente es así como dices xD

En cuanto al método repetido, si que lo llama para hacer comprobaciones con el if:

Código (java) [Seleccionar]
if(!repetido(empleados, nombre, sueldo)){
                empleados.add(new Empleado(nombre, sueldo));
           }


Ya que ese método devuelve un boolean y sirve para validar.

Salu2.

Baal_30

Aaah vale, lo usa para crear o no el nuevo Empleado. Yo a lo que me refería es que no muestre los que se repitan algun dato, pero que si los pueda crear. Supongo que poniendo el if ese dentro del for del main, y en vez de llamar al constructor, que imprima lo que imprime el for, conseguiría el resultado que busco, ¿no?
«La suerte es el cuidado de los detalles». -Winston Churchill

PabloPbl

Y tendrías que hacer algo parecido a lo que hice con el sueldo, si entendiste el código no debería ser un problema.

Cualquier duda me dices.

Baal_30

Voy a probar! okey cualquier duda te comento ;)

Muchas gracias :D
«La suerte es el cuidado de los detalles». -Winston Churchill

Baal_30

No me aclaro :/

He modificado así el código del for para imprimir:

Código (java) [Seleccionar]
for(int i=0;i<empleados.size();i++){
  if(repetido(empleados, empleados.get(i).getNombre(), empleados.get(i).getSueldo())){
  System.out.println("Empleado "+empleados.get(i).getNombre()+" sueldo "+empleados.get(i).getSueldo());
           }
}


Y el método lo he dejado así :

Código (java) [Seleccionar]
public static boolean repetido(ArrayList<Empleado> empleados, String nombre, int sueldo){

       for(int i=0;i<empleados.size();i++){
            if((empleados.get(i).getNombre().equals(nombre)) || (empleados.get(i).getSueldo()==sueldo)){
                return false;
            }
       }

       return true;
  }


Y pruebo creando 3 objetos, y dos de ellos con el mismo nombre, y no me imprime ninguno :/ y si cambio los returns( el false por el true y viceversa) me imprime los 3 aunque se repitan :/

«La suerte es el cuidado de los detalles». -Winston Churchill

PabloPbl

Mira este Código:


Clase 1:

Código (java) [Seleccionar]

import java.util.ArrayList;
import java.util.Scanner;

public class Clase1 {
   
    public static void main(String[] args) {
        ArrayList<Empleado> empleados = new ArrayList<Empleado>();

        Scanner s = new Scanner(System.in);

        while(true) {
            System.out.print("Introduce el nombre del empleado: ");
            String nombre = s.next();
            System.out.println();

            System.out.print("Introduce su sueldo: ");
            int sueldo = s.nextInt();
            System.out.println();

            empleados.add(new Empleado(nombre, sueldo));

            System.out.println("¿Quieres añadir algún empleado más? (S/N)");
            String respuesta = s.next();
            if(respuesta.equalsIgnoreCase("n")) {
                break;
            }
        }
       
        int[] valores = new int[empleados.size()];//En este array vamos guardando todos los valores de los empleados a medida que lo mostramos
        String[] empleadosImprimidos = new String[empleados.size()];
       
        for(int i = 0; i < empleados.size(); i++){//Recorremos todos los empleados agregados
            boolean mostrarEmpleadoActual = true;//Inidicamos si mostramos el usuario actual o no
           
            //Este ciclo se fija si el empleado actual tiene el mismo sueldo que otro empleado, si es asi cambia el valor de la variable
            //mostrarEmpleadoActual por false
            for (int i2 = 0; i2 < valores.length; i2++) {
                if(empleados.get(i).getSueldo() == valores[i2]) {
                    mostrarEmpleadoActual = false;
                    break;
                }
            }
           
            if(mostrarEmpleadoActual == true) {
                for(int i3 = 0; i3 < empleadosImprimidos.length; i3++) {
                    if(empleados.get(i).getNombre().equals(empleadosImprimidos[i3])) {
                        mostrarEmpleadoActual = false;
                        break;
                    }
                }
            }
           
            //Se fija el valor de la variable mostrarEmpleadoActual, si es verdadero mostramos el empleado
            if(mostrarEmpleadoActual) {
                valores[i] = empleados.get(i).getSueldo();
                empleadosImprimidos[i] = empleados.get(i).getNombre();
                empleados.get(i).get();
            }
        }
    }
}


Clase Empleado:
Código (java) [Seleccionar]


class Empleado {
    private String nombre;
    private int sueldo;

    public Empleado(String nombre, int sueldo){
            this.nombre = nombre;
            this.sueldo = sueldo;
    }
   
    public void get() {
        if(sueldo > 1) {
            System.out.println("Este empleado se llama "+this.nombre+" y su sueldo es de "+this.sueldo+" dolares por mes");
        }
        else if(sueldo >0) {
            System.out.println("Este empleado se llama "+this.nombre+" y su sueldo es de "+this.sueldo+" dolar por mes");
        }
        else{
            System.out.println("Este empleado se llama "+this.nombre+" y no tiene sueldo");
        }
    }
   
    public int getSueldo() {
        return this.sueldo;
    }
   
    public String getNombre() {
        return this.nombre;
    }
}



Este Código hace todo lo que quieres, tan solo tuve que modificar el for y agregar un array de String y problema solucionado.

Prueba haber que tal.

Salu2.

PabloPbl


Usuario Invitado

Hasta donde tengo entendido sobre lo que deseas hacer, lo haría así:

Código (java) [Seleccionar]
package com.company.app.model.entities;

public class Employee {
private Short id;
private String names;
private String surnames;
private Double salary;

public Employee() {}

public Employee(Short id, String names, String surnames, Double salary) {
super();
this.id = id;
this.names = names;
this.surnames = surnames;
this.salary = salary;
}

public Short getId() {
return id;
}

public void setId(Short id) {
this.id = id;
}

public String getNames() {
return names;
}

public void setNames(String names) {
this.names = names;
}

public String getSurnames() {
return surnames;
}

public void setSurnames(String surnames) {
this.surnames = surnames;
}

public Double getSalary() {
return salary;
}

public void setSalary(Double salary) {
this.salary = salary;
}


}


Código (java) [Seleccionar]
package com.company.app.model.entities;

import java.util.ArrayList;

public class EmployeeList extends ArrayList<Employee> {
private static final long serialVersionUID = 2924861284507271931L;

public EmployeeList() {
super();
}

public boolean hasRepeatProperties(Employee employee) {
boolean hasRepeat = false;
for(Employee e : this) {
if(e.equals(employee))
continue;
if(compareProperties(e.getId(), employee.getId())) {
hasRepeat = true;
break;
}
else if(compareProperties(e.getNames(), employee.getNames())) {
hasRepeat = true;
break;
}
else if(compareProperties(e.getSurnames(), employee.getSurnames())) {
hasRepeat = true;
break;
}
else if(compareProperties(e.getSalary(), employee.getSalary())) {
hasRepeat = true;
break;
}
}

return hasRepeat;
}

private boolean compareProperties(Object first, Object second) {
boolean hasRepeat = false;
if(first instanceof String) {
hasRepeat = first.equals(second);
}
else if (first instanceof Short){
hasRepeat = ((Short) first).shortValue() == ((Short) second).shortValue();
}
else if (first instanceof Double) {
hasRepeat = ((Double) first).doubleValue() == ((Double) second).doubleValue();
}

return hasRepeat;
}

}


Código (java) [Seleccionar]
package com.company.app;

import java.util.Scanner;

import com.company.app.model.entities.Employee;
import com.company.app.model.entities.EmployeeList;

public class Main {

public static void main(String[] args) {
EmployeeList employeeList = new EmployeeList();
Scanner reader = new Scanner(System.in);
String option = "S";

do {
Employee employee = new Employee();
System.out.println("Ingrese el ID del nuevo empleado");
employee.setId(Short.valueOf(reader.nextLine()));
System.out.println("\nIngrese sus nombres:");
employee.setNames(reader.nextLine());
System.out.println("\nIngrese sus apellidos");
employee.setSurnames(reader.nextLine());
System.out.println("Ingrese su salario");
employee.setSalary(Double.valueOf(reader.nextLine()));
employeeList.add(employee);
System.out.println("\n¿Desea seguir agregando empleados? S/N");
option = reader.nextLine();
}
while(option.equalsIgnoreCase("s"));
reader.close();

for(Employee employee : employeeList) {
if(employeeList.hasRepeatProperties(employee))
continue;
System.out.println("ID del empleado: "+employee.getId());
System.out.println("Nombres: "+employee.getNames());
System.out.println("Apellidos: "+employee.getSurnames());
System.out.println("Salario: "+employee.getSalary());
}

}

}


Claro que está demás decir que tienes que manejar las excepciones que pueden ocurrir (NumberFormatException, InputMismatchException).
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

PabloPbl

Hola Gus, estuve viendo un poco tu código y vi una parte en la que obtenías los datos desde la clase Scanner:

Código (java) [Seleccionar]
System.out.println("Ingrese el ID del nuevo empleado");
employee.setId(Short.valueOf(reader.nextLine()));
System.out.println("\nIngrese sus nombres:");
employee.setNames(reader.nextLine());
System.out.println("\nIngrese sus apellidos");
employee.setSurnames(reader.nextLine());
System.out.println("Ingrese su salario");
employee.setSalary(Double.valueOf(reader.nextLine()));
employeeList.add(employee);
System.out.println("\n¿Desea seguir agregando empleados? S/N");
option = reader.nextLine();


y la pregunta es, ¿La clase Scanner solo puede obtener un tipo de dato en particular?

¿Esto estaría mal?
Código (java) [Seleccionar]

Scanner scanner = new Scanner(System.in);
String nombre = sca.nextLine();
int edad = sca.nextInt();


Y ¿Esto estaría bien?
Código (java) [Seleccionar]

Scanner scanner = new Scanner(System.in);
String nombre = sca.nextLine();
int edad = Integer.parseInt(sca.nextLine());


La duda surge, por que estaba haciendo un par de cosas con esta clase y pues obtenía datos diferentes y me daba error, pero no si era por eso.

Usuario Invitado

Ambas formas son válidas. La razón por la que uso el nextLine es por preferencia personal.

Por ejemplo, cuando lees un entero, Scannet te devuelve lo ingresado pero el enter que das se guarda en el input por lo que si seguidamente llamas a nextLine, éste método leerá lo que ha quedado en el input y el resultado es la percepción que se ha dado un enter automáticamente. Para evitar ésto debes de llamar al método nextLine solo para que lea el enter dejado por el nextInt y a continuación puedes seguir guardando Strings.

Usando solo nextLine me evito ésto y solo tendría que poner un catch para NumberFormatException.

Saludos.
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein