Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    50

    [JAVA] Classe Dipendenti. Problema OutOfBonds di array

    Salve a tutti, sto implementando una classe dipendente.. questa è la traccia:
    07/01/2012

    Traccia:

    Scrivere un programma Java adatto a rappresentare i dipendenti di una azienda.
    Implementare le seguenti funzionalità:

    1) Inserimento da terminale in un array dei dati:

    nome
    cognome
    stipendio
    tipologia (direttore,impiegato, lavoratore a cottimo).

    2) ordinamento dei dati secondo un criterio di ordinamento scelto a run time dall'utente tra cognome-tipologia stipendio;

    3) visualizzazione dei dati in forma tabellare;

    4) popolamento di array finale che contenga tutti i dati relativi ai dipendenti di due distinte filiali il cui stipendio supera i 1000 euro.

    5) calcolo e visualizzazione delle seguenti statistiche aziendali;
    -stipendio medio dei dipendenti per tipologia;
    -spesa annua per il personale.
    Questa è la classe:

    codice:
    public class Dipendente {
    /**Scrivere un programma Java adatto a rappresentare 
     * i dipendenti di una azienda.*/
    	
    	public Dipendente(String name, String sur, double stip, String type)
    	{
    		nome=name;
    		cognome=sur;
    		stipendio=stip;
    		tipo=type;
    	}
    	
    	public String getName()
    	{
    		return nome;
    	}
    	public void setName(String v)
    	{
    		nome=v;
    	}	
    	//___________________________________
    	public String getSur()
    	{
    		return cognome;
    	}
    	public void setSur(String v)
    	{
    		cognome=v;
    	}	
    	//___________________________________	
    	public String getType()
    	{
    		return tipo;
    	}
    	public void setType(String v)
    	{
    		tipo=v;
    	}	
    	//___________________________________	
    	public double getStip()
    	{
    		return stipendio;
    	}
    	public void setStip(double v)
    	{
    		stipendio=v;
    	}	
    	//___________________________________	
    	//ORDINAMENTO PER COGNOME
    	//(ISERTION SORT)
    	public static void ordSur(Dipendente[]v)
    	{
    		Dipendente temp;
    		for (int i=1;i<v.length;i++)
    		{
    			for(int j=i;j>0;j--)
    			{
    				if((v[j].cognome).compareToIgnoreCase(v[j-1].cognome)<0)
    				{
    					temp=v[j];
    					v[j]=v[j-1];
    					v[j-1]=temp;
    				}
    			}
    		}
    	}
    	//__________________________________
    	//ORDINAMENTO PER TIPOLOGIA
    	//(ISERTION SORT)
    	public static void ordType(Dipendente[]v)
    	{
    		Dipendente temp;
    		for (int i=1;i<v.length;i++)
    		{
    			for(int j=i;j>0;j--)
    			{
    				if((v[j].tipo).compareToIgnoreCase(v[j-1].tipo)<0)
    				{
    					temp=v[j];
    					v[j]=v[j-1];
    					v[j-1]=temp;
    				}
    			}
    		}
    	}
    	//__________________________________
    	//ORDINAMENTO PER STIPENDIO
    	//(ISERTION SORT)
    	public static void ordStip(Dipendente[]v)
    	{
    		Dipendente temp;
    		for (int i=1;i<v.length;i++)
    		{
    			for(int j=i;j>0;j--)
    			{
    				if((v[j].stipendio)<(v[j-1].stipendio))
    				{
    					temp=v[j];
    					v[j]=v[j-1];
    					v[j-1]=temp;
    				}
    			}
    		}
    	}	
    	//_____________________________________________
    	//VISUALIZZAZIONE DEI DATI IN FORMA TABELLARE
    	public static void showTab(Dipendente[]v)
    	{
    		for(int i=0; i<v.length;i++)
    		{
    			System.out.println(v[i].cognome+", "+v[i].nome+
    					", "+v[i].stipendio+", "+v[i].tipo+ "\t");
    		}
    	}
    	//STAMPA NORMALE
    	public static void stampa(Dipendente[]v)
    	{
    		for(int i=0; i<v.length;i++)
    		{
    			System.out.println(v[i].nome+", "+v[i].cognome+", "
    					+v[i].stipendio+", "+v[i].tipo);
    		}
    	}
    	//_____________________________________________
    	//popolamento di array finale che contenga tutti i 
    	//dati relativi ai dipendenti di due distinte filiali 
    	//il cui stipendio supera i 1000 euro.
    	
    	public static Dipendente[] merge1000(Dipendente[]v1,Dipendente[]v2)
    	{
    		//mi ricavo 2 vett ognuno ha gli
    		//stipendi >1000
    		Dipendente[] j = Dipendente.conta1000(v1); 
    		Dipendente[] y = Dipendente.conta1000(v2);
    		Dipendente[] nuovo = new Dipendente[j.length+y.length];
    		Dipendente.ordStip(j);
    		Dipendente.ordStip(y);
    		int iFirst=0;
    		int iSecond=0;
    		int cont=0;
    		if(j[iFirst].stipendio<y[iSecond].stipendio)
    		{
    			nuovo[cont]=j[iFirst];
    			iFirst++;
    		}
    		else
    		{
    			nuovo[cont]=y[iSecond];
    			iSecond++;
    		}
    		cont++;
    		//copia in a tutti i valori rimasti nel primo array
    		System.arraycopy(j,iFirst,nuovo,cont,j.length-iFirst);
    		//copia in a tutti i valori rimasti nel secondo array
    		System.arraycopy(y,iSecond,nuovo,cont,y.length-iSecond);
    		
    		return nuovo;
    	}
    	//___________________________________________
    	private static Dipendente[] conta1000(Dipendente[]v)
    	{
    		int contatore=0;
    		for(int i=0;i<v.length;i++)
    		{
    			if(v[i].stipendio>1000)
    			{
    				contatore++;
    			}
    		}
    		Dipendente[] vettore = new Dipendente[contatore];
    		for(int i=0;i<v.length;i++)
    		{
    			if(v[i].stipendio>1000)
    			{
    				vettore[i]=v[i];
    			}
    		}
    		return vettore;
    	}
    	
    	
    	//_________________________________________________
    	//calcolo e visualizzazione delle seguenti 
    	//statistiche aziendali:
        //-stipendio medio dei dipendenti per tipologia;
        //-spesa annua per il personale.
    	//--------------
    	//SPESA ANNUA PER IL PERSONALE:
    	public static double SpesaAnnua(Dipendente[]array)
    	{
    		double somma=0;
    		for(int i=0;i<array.length;i++)
    		{
    			somma = somma + array[i].stipendio;
    		}
    		return somma;
    	}
    	//--------------
    	//STIPENDIO MEDIO PER IMPIEGATO
    	public static double mediaImp(Dipendente[]array)
    	{
    		double somma=0;
    		int cont=0;
    		for(int i=0;i<array.length;i++)
    		{
    			if((array[i].tipo).equalsIgnoreCase("impiegato"))
    			{
    				somma = somma+array[i].stipendio;
    				cont++;
    			}
    		}
    		double media = somma/cont;
    		return media;
    	}
    	//--------------
    	//STIPENDIO MEDIO PER DIRETTORE
    	public static double mediaDiret(Dipendente[]array)
    	{
    		double somma=0;
    		int cont=0;
    		for(int i=0;i<array.length;i++)
    		{
    			if((array[i].tipo).equalsIgnoreCase("direttore"))
    			{
    				somma = somma+array[i].stipendio;
    				cont++;
    			}
    		}
    		double media = somma/cont;
    		return media;
    	}
    	//--------------
    	//STIPENDIO MEDIO PER LAVORATORE A COTTIMO
    	public static double mediaCott(Dipendente[]array)
    	{
    		double somma=0;
    		int cont=0;
    		for(int i=0;i<array.length;i++)
    		{
    			if((array[i].tipo).equalsIgnoreCase("cottimo"))
    			{
    				somma = somma+array[i].stipendio;
    				cont++;
    			}
    		}
    		double media = somma/cont;
    		return media;
    	}
    	//___________________________________________
    	
    	
    	
    //campi esemplare
    	private String nome;
    	private String cognome;
    	private double stipendio;
    	private String tipo;
    
    }
    e questo è il tester:

    codice:
    import java.util.Scanner;
    
    
    public class Dipendente_tester {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		int scelta;
    		Scanner in = new Scanner(System.in);
    		System.out.println("QUANTI DIPENDENTI VUOI INSERIRE " +
    				"NELLA PRIMA FILIALE?");
    		int num = in.nextInt();
    		Dipendente[] filiale1 = new Dipendente[num];
    		System.out.println("QUANTI DIPENDENTI VUOI INSERIRE " +
    				"NELLA SECONDA FILIALE?");
    		int num1 = in.nextInt();
    		Dipendente[] filiale2 = new Dipendente[num1];
    		Dipendente[] nuov ;
    		
    	do
    	{
    		System.out.println("Scegli tra le seguenti azioni:"
    				+"\n1.Inserimento dei dati di due filiali"
    				+"\n2.Ordinamento dei dati per cognome"
    				+"\n3.Ordinamento dei dati per tipologia"
    				+"\n4.Ordinamento dei dati per stipendio"
    				+"\n5.Visualizzazione dei dati in forma tabellare"
    				+"\n6.Raggruppamento dei dati di dipendenti con" 
    				+"\n	stipendio superiore a 1000€"
    				+"\n7.Stipendio medio Direttori"
    				+"\n8.Stipendio medio Impiegati"
    				+"\n9.Stipendio medio Lavoratori a cottimo"
    				+"\n10.Spesa annuale per il personale"
    				+"\n11.Terminare programma");
    		
    		scelta = in.nextInt();
    		
    		switch(scelta)
    		{
    		case 1:
    			System.out.println("+__PRIMA FILILE__+");
    			for(int i=0;i<filiale1.length;i++)
    			{
    				System.out.println("Nome dipendente"+(i+1)+": ");
    				String nome = in.next();
    				System.out.println("Cognome dipendente"+(i+1)+": ");
    				String cognome = in.next();
    				System.out.println("Stipendio dipendente"+(i+1)+": ");
    				int stipendio = in.nextInt();
    				System.out.println("tipologia dipendente"+(i+1)+": ");
    				String tipo = in.next();
    				
    				Dipendente dip = new Dipendente(nome,cognome,stipendio,tipo);
    				filiale1[i]=dip;
    			}
    			//_________________________________
    			System.out.println("+__SECONDA FILILE__+");
    			for(int i=0;i<filiale2.length;i++)
    			{
    				System.out.println("Nome dipendente"+(i+1)+": ");
    				String nome = in.next();
    				System.out.println("Cognome dipendente"+(i+1)+": ");
    				String cognome = in.next();
    				System.out.println("Stipendio dipendente"+(i+1)+": ");
    				int stipendio = in.nextInt();
    				System.out.println("tipologia dipendente"+(i+1)+": ");
    				String tipo = in.next();
    				
    				Dipendente dip = new Dipendente(nome,cognome,stipendio,tipo);
    				filiale2[i]=dip;
    			}
    			break;
    		//____________________________________
    		case 2:
    			Dipendente.ordSur(filiale1);
    			System.out.println("ORDINAMENTO PER COGNOME FIL 1");
    			Dipendente.stampa(filiale1);
    			Dipendente.ordSur(filiale2);
    			System.out.println("ORDINAMENTO PER COGNOME FIL 2");
    			Dipendente.stampa(filiale2);
    			break;
    			
    		case 3:
    			Dipendente.ordType(filiale1);
    			System.out.println("ORDINAMENTO PER TIPO FIL 1");
    			Dipendente.stampa(filiale1);
    			Dipendente.ordType(filiale2);
    			System.out.println("ORDINAMENTO PER TIPO FIL 2");
    			Dipendente.stampa(filiale2);
    			break;
    			
    		case 4:
    			Dipendente.ordStip(filiale1);
    			System.out.println("ORDINAMENTO PER STIPENDIO FIL 1");
    			Dipendente.stampa(filiale1);
    			Dipendente.ordStip(filiale2);
    			System.out.println("ORDINAMENTO PER STIPENDIO FIL 2");
    			Dipendente.stampa(filiale2);
    			break;
    			
    		case 5:
    			//visualizz in forma tabellare
    			System.out.println("_TABELLA FILIALE 1_");
    			Dipendente.showTab(filiale1);
    			System.out.println("_TABELLA FILIALE 2_");
    			Dipendente.showTab(filiale2);
    			break;
    			
    		case 6: 
    			nuov= Dipendente.merge1000(filiale1, filiale2);
    			Dipendente.stampa(nuov);
    			break;
    			
    		case 7:
    			System.out.println("STIPENDIO MEDIO DIRETTORI");
    			nuov= Dipendente.merge1000(filiale1, filiale2);
    			System.out.println(Dipendente.mediaDiret(nuov));
    			break;
    			
    		case 8:
    			System.out.println("STIPENDIO MEDIO IMPIEGATI");
    			nuov= Dipendente.merge1000(filiale1, filiale2);
    			System.out.println(Dipendente.mediaImp(nuov));
    			break;
    			
    		case 9:
    			System.out.println("STIPENDIO MEDIO LAV.COTT");
    			nuov= Dipendente.merge1000(filiale1, filiale2);
    			System.out.println(Dipendente.mediaCott(nuov));
    			break;
    			
    		case 10:
    			System.out.println("SPESA ANNUA DEL PERSONALE");
    			nuov= Dipendente.merge1000(filiale1, filiale2);
    			System.out.println(Dipendente.SpesaAnnua(nuov));
    			
    	
    		}
    		
    	
    		
    	}while(scelta!=11);	
    	System.out.println("Programma terminato!");
    		
    	
    		
    		
    		
    
    	}
    
    }
    Sto impazzendo da parecchie ore sul punto 6 del menu, ovvero quello dell'unione in un array di tutti i dipendenti con stipendio >1000.
    Questo è il messaggio che mi si presenta quando inserisco la scelta s dello switch:

    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
    at Dipendente.conta1000(Dipendente.java:176)
    at Dipendente.merge1000(Dipendente.java:134)
    at Dipendente_tester.main(Dipendente_tester.java:111)


    precisamente a queste linee:
    ....
    Dipendente[] vettore = new Dipendente[contatore];
    for(int i=0;i<v.length;i++)
    {
    if(v[i].stipendio>1000)
    {
    vettore[i]=v[i];
    }
    }
    return vettore;
    ....


    Qualcuno potrebbe aiutarmi a capire dov'è il problema?? Il mio cervello si sta fondendo :/

  2. #2
    L'errore è qui:
    codice:
    Dipendente[] vettore = new Dipendente[contatore];
    		for(int i=0;i<v.length;i++)
    		{
    			if(v[i].stipendio>1000)
    			{
    				vettore[i]=v[i];
    			}
    		}
    metti caso hai 30 dipendenti (quindi v.lenght=30 e il for farà 30 cicli)
    ma persone maggiore di 1000 ne hai solo 10 (quindi contatore =10 e vettore di 10 posizioni)
    nel momento in cui analizzerai la posizione 29 ad esempio e il suo stipendio supera 1000 farai:

    vettore[29]=v[29] ma vettore ha solo 10 posizioni e il sistema ti ritornerà l'errore a runtime

    semmai devi fare così
    codice:
    int pos=0;
    Dipendente[] vettore = new Dipendente[contatore];
    		for(int i=0;i<v.length;i++)
    		{
    			if(v[i].stipendio>1000)
    			{
    				vettore[pos++]=v[i];
    			}
    		}
    Ciao.
    P.S. Un'ultima cosa che esula dall'errore.
    Era meglio che ti creavi una classe Entity come Dipendente dove inserivi solo i metodi getter e setter dei vari attributi (nome, cognome, stipendio etc), e poi una classe control dove ti facevi tutti i tuoi controlli.
    anche perché in questo caso i metodi get e set a cosa ti servono?
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.