[Java]: Dove sbaglio?

Lionel2
Salve,

ho cercato di migliorare il programma precedente:

import java.util.Scanner;
import java.util.Vector;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Lionel
 */
public class Dipendente {
    
    public Dipendente(String nome, double pagaPerOre){
        this.nome = nome;
        this.pagaPerOre = pagaPerOre;
    }
    
    public static Dipendente leggi(Scanner sc) {
        String nome = null;
        double pagaPerOra = 0;
        System.out.println("Immetti Dipendente: ");
        String tmp = sc.nextLine();
        nome = tmp;
        //Stessa considerazione di prima, se non c'e' il voto dopo il nome
        System.out.println("Immetti Paga Per Ora: ");
        tmp = sc.nextLine();
        pagaPerOra = Integer.parseInt(tmp);
        //inutile creare un oggetto solo per restituirlo        
        return new Dipendente(nome, pagaPerOra);        
    }
    
    public void search(double pagaPerOreInf, Vector v){
        int k;
        for(k=0; k<v.size(); k++){
            Dipendente e = (Dipendente) v.elementAt(k);
            if(e.getPagaPerOre() == pagaPerOreInf){
                System.out.println("Impiegato " +e);
            }
        }
    }

    public String getNome() {
        return nome;
    }

    public double getPagaPerOre() {
        return pagaPerOre;
    }
    
    private String nome;
    private double pagaPerOre;
}


e la relativa classe di collaudo

import java.util.Enumeration;
import java.util.Scanner;
import java.util.Vector;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Lionel
 */
public class CreaDipendente {
    public static void main(String args[]) {
        //Leggo dal file i dati che mi servono
        Scanner sc = new Scanner(System.in);
        //Un vettore che sarà riempito di oggetti di tipo studente
        Vector v = new Vector();
        Dipendente dipendente = Dipendente.leggi(sc);
        for(int i=0; i<2; i++){
            //Inserisco gli oggetti nel vettore
            v.addElement(dipendente);
            System.out.println(dipendente.getNome() + " " + dipendente.getPagaPerOre() + " ");
            //Assegnazione che dovrebbe permettermi di uscire dal ciclo
            dipendente = Dipendente.leggi(sc);
        }
        dipendente.search(10, v);
    }
} 


Perché il programma non stampa l'impiegato con il salario pari a 10 euro? E stampa la classe e un hashCode?

Grazie.

Risposte
Howard_Wolowitz
Ho visto questa mattina il tuo messaggio ed ho implementato quello che chiedevi che posto qui di seguito:
Classe impiegato:
public class Employee{

	private String name;
	private double rate;
	private double pay;
	private int hours;

	public Employee(){
		this("Nessun nome",0,0);	
	}

	public Employee(String name){
		this(name,0,0);
	}

	public Employee(String name, double rate){
		this(name,rate,0);
	}

	public Employee(String name, double rate, int hours){
		setName(name);
		setRate(rate);
		setHours(hours);
		calcPay();	
	}
	
	private void setName(String name){
		this.name=name;
	}

	private void setRate(double rate){
		if(rate>=0)
			this.rate=rate;
		else
			System.out.println("ERRORE! Stipendio negativo!");
	}

	public double calcPay(){
		if(this.pay != rate * hours)
			this.pay = rate * hours;	
		return rate * hours;
	}

	public void setHours(int hours){
		if(hours>=0)
			this.hours=hours;
		else
			System.out.println("ERRORE! Ore negative!");
	}

	public String getName(){
		return name;
	}

	public double getRate(){
		return rate;
	}
	
	public int getHours(){
		return hours;
	}

	public String toString(){
		return "Nome: "+getName()+" Paga: "+getRate()+" Ore di lavoro: "+getHours()+" Stipendio: "+calcPay();
	}

	public boolean equals(Object obj){
		if(obj == null || !(obj instanceof Employee))
			return false;
		else{
			Employee temp = (Employee) obj;
			return (this.name.equals(temp.name) &&
				this.rate == temp.rate &&
				this.hours == temp.hours);
		}
	}

}	

Classe Azienda:
import java.util.ArrayList;
import java.util.Scanner;
public class Company{

	private ArrayList<Employee> employeeVector;

	public Company(){
		employeeVector=new ArrayList();
	}

	public int getNumeroImpiegati(){
		return employeeVector.size();
	}

	public void addEmployee(Employee newEmployee){
		if(newEmployee != null)
			employeeVector.add(newEmployee);
	}

	public void removeEmployee(Employee exitEmployee){
		employeeVector.remove(exitEmployee);
	}

	public String toString(){
		String string = "";
		for(Employee temp : employeeVector)
			string += temp + "\n";
		return string;
	}

	public static void main(String [] args){
		Company azienda = new Company();	
		boolean inserimentoTerminato=false;
		Scanner tastiera = new Scanner(System.in);	
		System.out.println("Inserire i campi indicati di seguito.");
		while(!inserimentoTerminato){
			System.out.print("Nome: ");
			String name = tastiera.next();	
			System.out.print("Paga: ");
			double rate = tastiera.nextDouble();
			System.out.print("Ore lavorate: ");
			int hours = tastiera.nextInt(); 
			azienda.addEmployee(new Employee(name,rate,hours));	
			System.out.println("Ci sono ancora impiegati da inserire?(S/n)");
			if(tastiera.next().toUpperCase().charAt(0)=='N')
				inserimentoTerminato = true;
		}
		System.out.println(azienda.toString());	
	}	

}

Innanzitutto, riguardo al programma da te postato precedentemente devo dirti che è buona cosa il fatto che tu commenti con i @tags tipici della javadoc.
Meno buona l'implementazione della classe Employee che letteralmente "mixava" quella che era la logica di business con l'interfaccia utente, insomma il fatto di passare alla funzione un oggetto di tipo Scanner non è il massimo... andrebbe messo nel main della classe di collaudo e lì solamente.
Seconda cosa, mettevi un Vector come variabile di istanza, in questo modo ad ogni impiegato che crei, oltre all'impiegato stesso, crei un nuovo vettore... una definizione ricorsiva che non funziona.
Per quanto riguarda la mia implementazione ho cercato di rendere il tutto il più possibile fedele al programma da te cercato, cercando peraltro di mantenere sempre la consistenza dei dati inseriti.
Ho creato una classe Employee che ricalca i metodi da te inseriti nella classe dal medesimo nome ed una classe Company che si occupa di gestire gli impiegati in un vettore di tipo ArrayList(N.B. la differenza tra le due classi ed i compiti diversi che esse svolgono).
A meno di esigenze particolari, quali l'accesso concorrente, non è consigliabile utilizzare la classe Vector al posto di quella ArrayList che risulta per determinati motivi più prestante e per giunta fa uso dei medesimi metodi contenuti nella classe Vector.
Infine, ammesso tu voglia utilizzare la classe Vector un vettore di oggetti(ad esempio String) si inizializza in un altro modo con l'utilizzo delle Wildcards(in breve parentesi angolari con all'interno il nome della classe) ovvero
Vector<String> vettore = new Vector();

La classe Vector come da te usata era presente nelle vecchie versioni della JDK e dalla 6 non è più utilizzata, si utilizza la versione da me precedentemente citata con la classe degli oggetti da contenere tra parentesi angolari.
Per il resto il consiglio è di guardarti le classi da me implementate, provare ad eseguire Company che contiene un main dimostrativoe e leggerti il tutorial sulle Collezioni a questo link: http://docs.oracle.com/javase/tutorial/ ... index.html
Chiedi se hai qualche dubbio su qualcosa.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.