class Veicolo { // Dimensionamento iniziale del numero dei messaggi public static final int NUMERO_INIZIALE_MESSAGGI = 1; // Tipologia di veicolo public static final int LOCOMOTORE = 0; public static final int PASSEGGERI = 1; public static final int MERCI = 2; // Gestione del numero progressivo private static int progressivo = 0; // Attributi variabili private int codice; private int tipo; private int oreServizio; private int numeroServizi; private Messaggio[] elencoMessaggi; private int numeroMessaggi; // Costruttore public Veicolo( int tipo ) { codice = progressivo++; this.tipo = tipo; oreServizio = numeroServizi = 0; elencoMessaggi = new Messaggio[NUMERO_INIZIALE_MESSAGGI]; numeroMessaggi = 0; } // Metodi di interrogazione public int restituisciCodice() { return codice; } public int restituisciNumeroMessaggi() { return numeroMessaggi; } public Messaggio restituisciMessaggio( int i ) { return elencoMessaggi[i]; } // Aggiunta di un messaggio public void aggiungi( Messaggio m ) { if (numeroMessaggi == elencoMessaggi.length) { Messaggio[] tmp = new Messaggio[numeroMessaggi * 2]; for (int i = 0; i < numeroMessaggi; ++i) { tmp[i] = elencoMessaggi[i]; } elencoMessaggi = tmp; } elencoMessaggi[numeroMessaggi++] = m; } // Cancellazione di tutti i messaggi public void eliminaMessaggi() { numeroMessaggi = 0; } // Calcolo del numero di messaggi generati da un certo dispositivo public int numeroMessaggiGeneratiDa( String dispositivo ) { int risultato = 0; for (int i = 0; i < numeroMessaggi; ++i) { String tmp = elencoMessaggi[i].restituisciDispositivo(); if (tmp.equals(dispositivo)) { ++risultato; } } return risultato; } // Ricerca di tutti i messaggi generati da un certo dispositivo public Messaggio[] messaggiGeneratiDa( String dispositivo ) { int num = numeroMessaggiGeneratiDa(dispositivo); Messaggio[] risultato = new Messaggio[num]; int j = 0; for (int i = 0; i < numeroMessaggi; ++i) { String tmp = elencoMessaggi[i].restituisciDispositivo(); if (tmp.equals(dispositivo)) { risultato[j++] = elencoMessaggi[i]; } } return risultato; } // Calcolo del numero di messaggi per tipologia e con un data severità public int[] messaggiConSeverità( int severità ) { int[] risultato = new int[Messaggio.NUMERO_TIPOLOGIE]; for (int i = 0; i < numeroMessaggi; ++i) { if (elencoMessaggi[i].restituisciSeverità() == severità) { ++risultato[elencoMessaggi[i].restituisciTipo()]; } } return risultato; } // Calcolo del numero di messaggi con severità superiore ad una data public int messaggiConSeveritàMaggioreDi( int severità ) { int risultato = 0; for (int i = 0; i < numeroMessaggi; ++i) { if (elencoMessaggi[i].restituisciSeverità() > severità) { ++risultato; } } return risultato; } // Calcolo del numero di dispositivi in condizioni critiche public int dispositiviInCondizioneCritica() { int risultato = 0; // Per evitare di contare più volte i dispositivi in condizione // critica, utilizzo un vettore temporaneo che contiene i dispositivi // già segnalati come tali. String tmp[] = new String[numeroMessaggi]; int j = 0; for (int i = 0; i < numeroMessaggi; ++i) { String dispositivo = elencoMessaggi[i].restituisciDispositivo(); if (!appartiene(dispositivo, tmp, j) && critico(dispositivo)) { ++risultato; // Registra il dispositivo come critico tmp[j++] = dispositivo; } } return risultato; } // Metodi privati per il calcolo dei dispositivi in cond. critica private boolean appartiene( String k, String[] v, int N ) { for (int i = 0; i < N; ++i ) { if (v[i].equals(k)) { return true; } } return false; } private boolean critico( String k ) { for (int i = 0; i < numeroMessaggi; ++i) { if (elencoMessaggi[i].restituisciTipo() == Messaggio.ERRORE) { // Il messaggio è di errore: posso concludere condizione critica return true; } else if (elencoMessaggi[i].restituisciTipo() == Messaggio.ALLARME) { // Se il messaggio è di allarme, allora... if (elencoMessaggi[i].restituisciSeverità() > 5) { // ... se la severità dell'allarme è >5 provo a cercare un altro // allarme con severità > 5 nel corso della stessa giornata int giorno = elencoMessaggi[i].restituisciGiorno(); // Il ciclo parte da i+1 e termina quando l'elenco messaggi è // terminato oppure il giorno è cambiato for (int j=i+1; ((j < numeroMessaggi) && (elencoMessaggi[j].restituisciGiorno()==giorno)); j++) { if ((elencoMessaggi[j].restituisciTipo() == Messaggio.ALLARME) && elencoMessaggi[j].restituisciSeverità() > 5) { return true; } } } else { // ... altrimenti provo a cercare un altro allarme nell'arco // dei prossimi 10 secondi int limite = elencoMessaggi[i].restituisciIstante() + 10; // Il ciclo parte da i+1 e termina quando l'elenco messaggi è // terminato oppure l'istante di generazione ha superato i 10 // secondi a partire dal primo allarme for (int j=i+1; ((j < numeroMessaggi) && (elencoMessaggi[j].restituisciIstante() <= limite)); j++) { if (elencoMessaggi[j].restituisciTipo() == Messaggio.ALLARME) { return true; } } } } } return false; } }