PROBLEMA Potete aiutarmi con java?

Pubblicità

Stefanokj

Utente Attivo
Messaggi
333
Reazioni
7
Punteggio
55
Ciao ragazzi,
sono molto incasinato con un programma che dovrebbe "gestire" un pronto soccorso.
Praticamente vengono registrati i nominativi dei pazienti che necessitano di un intervento classificando i casi come rossi=molto urgenti, gialli=normalmente urgenti, bianchi=poco urgenti.
Tutti i casi rossi devono essere gestiti prima dei gialli, e tutti i gialli prima dei bianchi indipendentemente dall'ordine di arrivo.

devo realizzare una classe che consenta di:
-Aggiungere un paziente alla lista di attesa in modo da rispettare l'ordine di priorità
-recupero del nominativo ed eliminazione del paziente col massimo grado di urgenza alla lista
-determinazione dei pazienti rossi,gialli e bianchi in attesa
-eliminazione della lista di un paziente specifico
-salvataggio e ripristino della lista ordinata dei nominativi in/da un file di tipo testuale.




Io ho realizzato la prima parte del programma (quella con get e set):
Codice:
public class Pazienti{private String Nome;
private String Cognome;
private String Codice;


public Pazienti(String Nome,String Cognome,String Codice){
this.Nome=Nome;
this.Cognome=Cognome;
this.Codice=Codice;
}


public String getNome(){
return Nome;
}


public void setNome(String Nom){
Nome=Nom;
}


public String getCognome(){
return Cognome;
}


public void setCognome(String Cogn){
Cognome=Cogn;
}


public String getCodice(){
return Codice;
}


public void setCodice(String Cod){
Codice=Cod;
}


public String tostring(){
String Stringa=" ";
Stringa=Stringa+ Nome + Cognome + Codice;
return Stringa;
}
}



E poi ho fatto parte del programma vero e proprio (ancora senza un main);
Sinceramente ora non so come muovermi, dovrei riuscire a fare l'ultimo punto (salvataggio e carica) e forse il penultimo, ma gli altri proprio....non riesco a districarmi tra i passaggi.

Ecco la il programma:
Codice:
import java.io.*;
import java.until.Vector;


public class ProntoSoccorso{
pivate Vector Paziente;


public ProntoSoccorso(){
Paziente=new Vector(1,1);


}


public void aggiunta(Paziente p){
Paziente.insertElementAt(p,0);
}


public void elimina(){
int posizione=0;
try{
Paziente.removeElementAt(posizione);
System.out.println("Eliminato!");
}
catch (Exeption e){
System.out.println("Non eliminato!");
}
}


public void visualizza(){
Paziente p;
System.out.println("Pazienti:");
for(int i=0;i<Paziente.size();i++){
System.out.println("Posizione"+i+":");
p=(Pazienti) Paziente.elementAt(i);
System.out.println(" "+p.toString());
}
}


public int numero(){
int r=0,g=0,b=0;
for(int i=0; i<Paziente.size();i++){
if(Paziente.elementAt[i].getCodice()=='r')
r++;
if(Paziente.elementAt[i].getCodice()=='g')
g++;
if(Pazienti.elementAt[i].getCodice()=='b')
b++;
}
return r;
return g;
return b;
}




public static void main(String[] args){
ProntoSoccorso S1=new ProntoSoccorso();


Potete darmi una mano??
PS non ho ancora fatto l'input con java...devo fare tutto nel main.

:help::help::help:
 
Ultima modifica:
Vorrei iniziare da alcuni dettagli che magari ti sembreranno irrilevanti e che di fatto non danno problemi nella pratica.
Il nome delle variabili... questo deve iniziare con la lettera minuscola (per convenzione).

Seconda cosa: puoi utilizzare il this nei metodi setter così come lo utilizzi nel costruttore.

Il metodo tostring() puo' essere riscritto:
Utilizzando la convenzione corretta:
Codice:
public String tostring(){
  return " "+nome+" "+cognome+" "+codice;
}

Non serve creare una stringa vuota (risparmi anche memoria :P ).

Ti consiglio ArrayList al posto di Vector, in quanto quest'ultima utilizza la sincronizzazione, e se non ti serve (come nel tuo caso) allora puoi evitarla tranquillamente (ArrayList da prestazioni migliori).
Inoltre da Java 5 ci sono i generics, e queste classi richiederebbero quindi il tipo di dato che intendi memorizzare. Nel tuo caso, dato che memorizzi Pazienti, dovrai fare:
Codice:
ArrayList<Pazienti> elencoPaziente = new ArrayList<Paziente>();

Arriviamo ora al tuo problema.
Se hai un solo elenco con tutti i pazienti (quindi non 3 differenti liste, una per codice) allora dovrai gestire in maniera differente gli inserimenti. La tua lista vede prima i codici rossi, poi i gialli e poi i bianchi; di conseguenza se ad esempio devi inserire un codice giallo, dovrai metterlo come ultimo dei gialli. Per la rimozione è corretto eliminare quello in testa (che sarà quello con priorità maggiore ("codice rosso") o comunque un giallo o un bianco).

Il metodo numero() è qualcosa di decisamente non corretto... non puoi far tornare 3 numeri in quel modo, non esiste un modo per farli tornare tutti insieme.

Procedendo per punti:
Aggiunta Paziente
Non puoi fare subito un add(paziente), in quanto non sai il suo codice. Di conseguenza guardi che codice ha "paziente", e poi lo inserisci. Se è un rosso lo inserisci come ultimo dei rossi, se è giallo dovrai trovare l'indice corretto (ultimo dei gialli), e se è bianco dovrai inserirlo come ultimo.
Per semplificare testerei
- se è rosso: lo metto come ultimo dei rossi (magari sfruttando un metodo numeroRossi(), così da conoscere la posizione, dato che si tratta dei primi della lista;
- se è bianco: lo metto alla fine della lista (è l'ultimo aggiunto con codice di priorità minore, quindi che ci siano altri bianchi o gialli prima di lui, va sempre alla fine);
- se è giallo: prendo il numero dei rossi e sommo a questo numero il numero dei gialli (ricordati di controllare gli indici.. su due piedi potrei dirti che la posizione che ottieni dovrebbe già essere corretta);

Recupero del nominativo
A quanto ho capito devi mostrare il primo paziente ed eliminarlo dalla lista.
Prima di eliminarlo sottrai 1 unità al contatore di rossi, gialli etc (se lo tieni in memoria, altrimenti non dovrai preoccupartene).

Determinazione pazienti in attesa
Sfrutti semplicemente i metodi per ottenere i pazienti dei 3 colori in coda.
Questo metodo del numero dei pazienti puoi scriverlo in diversi modi: potresti dichiarare 3 metodi privati tipo getRossi(), getGialli(), getBianchi(); crei poi un altro metodo getNumero() che riceve un parametro (il codice) ed in base al codice scegli quale metodo chiamare.
Oppure lasciare i 3 non privati.

Io molto probabilmente utilizzerei comunque 3 contatori (eviti di ripetere dover contare "un sacco" di volte).

Eliminazione di un paziente specifico
Il paziente da eliminare è specifico, quindi suppongo debba essere passato come parametro Nome e Cognome del paziente in questione. Dovrai quindi scorrere la lista ed eliminare quello che corrisponde ai dati passati.
Attenzione qui: non confrontare direttamente gli oggetti "paziente" creandone uno prima di passarlo al metodo: se fai in questo modo, nessuno corrisponderà, dato che l'oggetto è diverso (anche se il contenuto è uguale).
Io opterei per il nominativo, mi sembra più "probabile" (non è necessario specificare il codice per creare il paziente)...

Salvataggio lista
Dovrai scrivere un file riga per riga (o utilizzare la serializzazione, ma non mi sembra il caso).


Se qualcosa non fosse chiaro chiedi. ;)
Evito di scriverti il codice perchè non impareresti (e non ho tempo ora).
 
occhio che nel metodo toString() la "S" di String deve essere maiuscola, altrimenti definisci un metodo diverso (Java è sensibile al contesto);

per ritornare 3 numeri devi ritornare un Array a 3 posizioni, purchè i numeri siano tutti dello stesso tipo;
detto questo, invece di fare una lista unica di pazienti, ti converrebbe definire un array a 3 posizioni, ciascuna posizione è un ArrayList come ti ha suggerito RootKitNeo
in arr[0] aggiungi i pazienti 'r',
in arr[1] aggiungi i pazienti 'g',
in arr[2] aggiungi i pazienti 'b';
se fai in questo modo non hai mai bisogno di contare i pazienti in lista con un metodo scritto a mano, perché gli ArrayList hanno un metodo size() che ti ritorna direttamente la loro dimensione;
inoltre nota che con un array di ArrayList è già definita la priorità perché i codici sono già separati;
il metodo per restituire i più urgenti (quello che RootKitNeo chiama getRossi() ) restituirà semplicemente arr[0], così per gli altri.

Quando costruisci una classe pensa innanzitutto alle strutture dati opportune, ai metodi pensaci in un secondo tempo (anche se poi nella programmazione a oggetti le 2 cose vanno di pari passo); una buona struttura dati di partenza ti semplificherà la vita e la programmazione di tutto il resto.
 
Ultima modifica:
occhio che nel metodo toString() la "S" di String deve essere maiuscola, altrimenti definisci un metodo diverso (Java è sensibile al contesto);

Concordo, mi era sfuggito.

per ritornare 3 numeri devi ritornare un Array a 3 posizioni, purchè i numeri siano tutti dello stesso tipo;
detto questo, invece di fare una lista unica di pazienti, ti converrebbe definire un array a 3 posizioni, ciascuna posizione è un ArrayList come ti ha suggerito RootKitNeo
in arr[0] aggiungi i pazienti 'r',
in arr[1] aggiungi i pazienti 'g',
in arr[2] aggiungi i pazienti 'b';

Se ho capito bene utilizzi un array per memorizzare in ogni posizione una differente lista (ArrayList), una per ogni colore insomma. Ma in questo modo non andrebbe a "violare" una delle condizioni dell'esercizio?
Aggiungere un paziente alla lista di attesa in modo da rispettare l'ordine di priorità

Ci avevo pensato pure io, ma leggendo questa condizione ho pensato ad "una lista di priorità", quindi strutturata come esposto sopra.

Detto questo è una buona soluzione quella che hai proposto. ;)
Nella mia ho consigliato l'utilizzo di 3 variabili da incrementare (avrebbe evitato anche in questo modo di scorrere per avere il numero dei Pazienti).
 
@RootkitNeo
hai messo il dito nella piaga: difatti, sebbene la soluzione che ho/hai proposto sia più efficiente, bisogna vedere qual è lo scopo REALE dell'esercizio.
Se lo scopo reale dell'esercizio è far gestire manualmente una CODA allo studente, le soluzioni con ArrayList non vanno bene, perché l'ArrayList è già un a struttura dati implementata in modo nativo.

A questo punto lo studente dovrebbe difinire a mano il tipo di dato "coda con priorità", scrivendo tutti i metodi di inserimento e cancellazione degli elementi, comprese le 3 variabili che tengono conto del numero di pazienti per ciascun tipo. Niente di complicato, deve solo inserire in coda gli elementi rispettando le priorità e l'ordine (inserirà in fondo alla coda i pazienti a bassa priorità, in mezzo quelli a priorità media, i primi a uscire saranno i codici rossi).
Tutto questo si può fare ovviamente con un'unica struttura, oppure con una struttura mista a 3 code:
3 code separate da gestire col metodo classico "FIFO" (il primo che entra in coda è il primo a uscire), ma le 3 code hanno priorità diversa.

Solo per curiosità: le code multiple di priorità sono usate nei sistemi operativi per lo scheduling dei processi e/o del multithreading.

Se invece lo scopo dell'esercizio è "solo" gestire il pronto soccorso ed imparare ad usare alcune strutture dati predefinite in Java, allora gli ArrayList si possono usare (con tutti i vantaggi del caso).
 
Ecco infatti, concordo. ;)

L'unica precisazione è che l'ArrayList è "solo" un normale array, e non una struttura più "complessa".
 
Ragazzi, che dire...grazie 1000.
Mi dispiace, ma non ho potuto rispondere subito, ma mi avete chiarito ogni dubbio.
Siete grandi!! :inchino:
 
Pubblicità
Pubblicità
Indietro
Top