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.

Baal_30

Muy buenas, estoy aquí de nuevo con más dudas :/

Tengo este código :

Código (java) [Seleccionar]
public static void main(String[] args) {

ArrayList<Empleado> empleados = new ArrayList<Empleado>();

String resp;
Scanner S = new Scanner(System.in);

do{
char respuesta = 'S';
System.out.print("Introduce el nombre del empleado: ");
String nombre = S.nextLine();
System.out.println();

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

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

System.out.println("¿Quieres añadir algún empleado más? (S/N)");
resp = S.nextLine();
resp = resp.toUpperCase();
respuesta = (char)resp.charAt(0);

}while(respuesta=='S');

for(Empleado empl : empleados){
empleados.get(empl);
}



Tengo una clase llamada Empleado con este constructor :

Código (java) [Seleccionar]
private String nombre;
private int sueldo;

public Empleado(String nombre, int sueldo){
this.nombre = nombre;
this.sueldo = sueldo;
}


Y me da error en :
Código (java) [Seleccionar]
empleados.add(Empleado(nombre, sueldo));

También en el while, no entiendo por que :/

Y otro más en el método .get de la lista empleados (en el for).

La verdad es que llevo rato mirando el código y no tengo ni la más remota idea de porque esos errores :/

Gracias de antemano y un abrazo.
«La suerte es el cuidado de los detalles». -Winston Churchill

crack81

Código (java) [Seleccionar]
empleados.add(Empleado(nombre, sueldo));

en esta linea te esta faltando poner new ya que cada vez que agregas objeto Empleado tiene que ser uno nuevo

Código (java) [Seleccionar]
empleados.add(new Empleado(nombre, sueldo));

ademeas el for el metodo get pide un indice entero y tu le estas pasando un objeto lo mas correcto seria hacer un for desde 0 hasta empleados.size

espero solucione tus problemas saludos...

codigo
Código (java) [Seleccionar]
public class Testeo {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
       
        ArrayList<Empleado> empleados = new ArrayList<Empleado>();

        String resp;
        Scanner S = new Scanner(System.in);
        char respuesta = 'S';

        do{
           
            System.out.print("Introduce el nombre del empleado: ");
            String nombre = S.nextLine();
            System.out.println();

            System.out.print("Introduce su sueldo: ");
            int sueldo = S.nextInt();
            S.nextLine();//despues de usar el S.nextInt(); al teclear enter el valor se que da en el limbo
            //por lo cual es recomendable hacer un S.nextline(); antes del siguiente S.nextline();
            System.out.println();

            empleados.add(new Empleado(nombre, sueldo));//tienes que añadir un nuevo objeto cada vez que agreges
            //un empleado a la lista

            System.out.println("¿Quieres añadir algún empleado más? (S/N)");
            resp = S.nextLine();
            resp = resp.toUpperCase();
            respuesta = (char)resp.charAt(0);

            }while(respuesta=='S');

           
        for(int i=0;i<empleados.size();i++){
            System.out.println(empleados.get(i).toString());//el empleados get pide un entero no un objeto caso como lo tenias antes
        }


    }
   
}
Si C/C++ es el padre de los lenguajes entonces ASM es dios.

PabloPbl

#2
Para no ser repetitivo, he modificado un poco tu código. El código cumple la misma finalidad, solo que esta implementado de otra manera, te recomiendo que lo veas xD:

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;
           }
       }

       for(int i = 0; i < empleados.size(); i++){
        empleados.get(i).get();
       }
   }
}



Y esta es la clase Empleado, mira que he creado mi método get.

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");
       }
   }
}



Salu2.

Baal_30

Joder, que empanao que estoy :/ no darme cuenta del new...  :-[

He estado viendo tu código, y no se, ¿Es mejor hacerlo con un while, que con un do/while?
Lo que si voy a cambiar es lo de la condición, así es más simple sin pasarlo a char y tal :P

Respecto a lo del get, todavía no entiendo bien esa función, (si que la entiendo como la tienes hecha tú, lo que no entiendo es lo que hace si no la escribes tú mismo en la clase del objeto...) Pero, se me ha olvidado comentar que lo que tengo que mostrar son los empleados que no tengan ningún dato igual que otro, osea, si uno tiene de sueldo 1000, y otro también tiene 1000, que sólo muestre uno, aunque se llamen diferente.  O sea, que no muestre datos repetidos.

No se por donde cogerlo :/

Ah y se me olvidaba, gracias por las respuestas :)
«La suerte es el cuidado de los detalles». -Winston Churchill

PabloPbl

Pocas veces he tenido que recurrir al do/while, desde mi punto de vista, veo bastante mas sencillo hacerlo con el while, es como mas entendible.

Pues esa función get que dices, es propia de la clase ArrayList y lo que hace es devolver un objeto dentro del ArrayList, por ejemplo:

Código (java) [Seleccionar]
ArrayList array = new ArrayList();

Si yo quisiera obtener algo del array lo haría así:

Código (java) [Seleccionar]
array.get(0);

Ahí estaría obteniendo un objeto que esta en la posicion 1, funciona igual que con los Arrays tradicionales, tu metes y sacas los valores.

En cuanto a lo de:
CitarPero, se me ha olvidado comentar que lo que tengo que mostrar son los empleados que no tengan ningún dato igual que otro, osea, si uno tiene de sueldo 1000, y otro también tiene 1000, que sólo muestre uno, aunque se llamen diferente.  O sea, que no muestre datos repetidos.

Acá tienes que usar un poco mas de lógica, yo lo hice de la siguiente manera,
Seria bueno que le heches un ojo y lo intentes hacer de nuevo basándote en este código:

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
       
       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;
               }
           }
           
           //Se fija el valor de la variable mostrarEmpleadoActual, si es verdadero mostramos el empleado
           if(mostrarEmpleadoActual) {
               valores[i] = empleados.get(i).getSueldo();
               empleados.get(i).get();
           }
       }
   }
}



Lo único que he hecho acá fue cambiar agregar un array de int y modificar totalmente el ciclo for del final.

Código (java) [Seleccionar]

public int getSueldo() {
       return this.sueldo;
   }


Este metodo deberás agregarlo a la clase Empleado.

Si no entiendes algo, comenta la duda.

Salu2  ;)

Baal_30

Pero, si lo que te muestra es un objeto por ejemplo, Empleado, como el que tengo creado, ¿que te muestra exactamente? ¿todos sus atributos? ¿o el nombre del objeto creado?

Y respecto al código, he tenido que mirarmelo varias veces, me cuesta entenderlo haha :/ pero, tampoco se pueden repetir los nombres, no sólo el sueldo... ¿tendría que hacer dos arrays y dos blucles for más? :/

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

PabloPbl

Cuando yo estoy haciendo esto:

Código (java) [Seleccionar]
empleados.get(i).get();

Estoy haciendo referencia al objeto en la posición X del ArrayList con el metodo get y pasandole como parámetro el objeto que quiero hacer referencia, fíjate esto:

Código (java) [Seleccionar]
Empleado empleado1 = new Empleado("Baal_30", 4000);
empleado1.get();


Acá estoy creando un objeto y abajo estoy haciendo referencia al objeto creado y llamando a su metodo.

CitarY respecto al código, he tenido que mirarmelo varias veces, me cuesta entenderlo haha :/ pero, tampoco se pueden repetir los nombres, no sólo el sueldo... ¿tendría que hacer dos arrays y dos blucles for más? :/

Pero quieres que no se puedan crear 2 empleados con el mismo nombre o que no se repitan cuando los imprimo??.

PabloPbl

Cuando tu guardas objetos en un ArrayList y quieres llamar a un método de algún objeto o cambiarle algún atributo, primero tienes que referenciarte a dicho objeto y luego llamar a los métodos o atributos del mismo.

El clase ArrayList tiene un metodo get que te devuelve la referencia al objeto para poder manipularlo y cambiarle los atributos del objeto, como dije anteriormente es lo mismo que hacerlo asi:

Código (java) [Seleccionar]
Empleado empleado1 = new Empleado("Baal_30", 4000);
empleado1.get();


y asi se haria con un arrayList:

Código (java) [Seleccionar]

ArrayList array = new ArrayList();
array.add(new Empleado("Baal_30", 4000));
array.get(0).get();

crack81

creo que este codigo resuelve tus dudas no repite ni sueldos ni nombre
o si no vuelve a plantear tu pregunta

Código (java) [Seleccionar]
import java.util.ArrayList;
import java.util.Scanner;

/**
*
* @author bdwong
*/



public class Testeo {
   
   
   public static boolean repetido(ArrayList<Empleado> data,String nombre, int sueldo){
       
       for(int i=0;i<data.size();i++){
            if((data.get(i).getNombre().equals(nombre)) || (data.get(i).getSueldo()==sueldo)){
                return true;
            }
       
       }
       
       return false;
  }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
       ArrayList<Empleado> empleados = new ArrayList<Empleado>();
     
       Scanner s = new Scanner(System.in);

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

           System.out.println("Introduce su sueldo: ");
           int sueldo = s.nextInt();
           s.nextLine();
           
       
           
           
           if(!repetido(empleados, nombre, sueldo)){
                empleados.add(new Empleado(nombre, sueldo));
           }

         

           System.out.println("¿Quieres añadir algún empleado más? (S/N)");
           String respuesta = s.next();
           s.nextLine();
           if(respuesta.equalsIgnoreCase("n")) {
               break;
           }
       }
       
       for(int i=0;i<empleados.size();i++){
       
           System.out.println("Empleado "+empleados.get(i).getNombre()+" sueldo "+empleados.get(i).getSueldo());
       }
       
     
    }
   
}




Código (java) [Seleccionar]
public class Empleado {
   
   
    private String nombre;
    private int sueldo;

    public String getNombre() {
        return nombre;
    }

   

    public int getSueldo() {
        return sueldo;
    }

 
     
    public Empleado(String nombre, int sueldo){
           this.nombre = nombre;
           this.sueldo = sueldo;
    }
   
}
Si C/C++ es el padre de los lenguajes entonces ASM es dios.

Baal_30

Pablopbl genial explicado ;) El método get del ArrayList te dice que objeto está en esa posición, pero no te muestra nada por sí mismo, sólo la referencia al objeto como tal ¿no?

Y el método de "repetido" de crack81 creo que funcionaría bien, pero no veo cuando llamas a ese método para mostrar los que no se repiten en el for del main :/
«La suerte es el cuidado de los detalles». -Winston Churchill