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 :/