PDA

View Full Version : [JAVA] Problema controllo duplicazione in lista


Boomhauer88888
05-11-2009, 15:58
E un problema lungo da spiegare..ma in poche parole devo cercare duplicati di una lista all'interno dell'oggetto di cui è composta la lista..
se poi serve spiego meglio..magari posto il codice
aiutooo :o:

banryu79
05-11-2009, 16:14
Non ho capito molto:
Tu hai una lista e devi trovare tutti gli oggetti duplicati che essa potrebbe contenere?

Boomhauer88888
05-11-2009, 16:23
Ti posto un pezzo di codice:
La lista è creata nella classe offertaformativa:
public class OffertaFormativa {

private List<Corso> corsi=new ArrayList<Corso>();<---questa
private List<Docente> docenti=new ArrayList <Docente>();
private Corso c;
private int numdocenti;
private int oretot;


public Corso creaCorso(String nome, String descrizione){
c=new Corso(nome,descrizione);
corsi.add(c);
return c;
}ecc..

e io nella classe corso ho un metodo in cui devo cercare se ci sono duplicati in tutti i corsi:

public class Corso implements Comparable<Corso> {
private String nome;
private String descrizione;
public OffertaFormativa o=new OffertaFormativa();
private Map<String,Insegnamento> insegnamenti=new HashMap<String,Insegnamento>();

public Corso(String nome, String descrizione) {
this.nome=nome;
this.descrizione=descrizione;
}

public String getNome(){
return nome;
}

public String getDescrizione(){
return descrizione;
}


public Insegnamento nuovoInsegnamento(String codice, String nome, int crediti)
throws CodiceInsegnamentoDuplicato{
if(insegnamenti.containsKey(codice)) throw new CodiceInsegnamentoDuplicato();

for(Corso c:o.getCorsi()){
if(c.insegnamenti.containsKey(codice))throw new CodiceInsegnamentoDuplicato();<--- ho provato cosi ma non funziona
}
Insegnamento i=new Insegnamento(codice,nome,crediti);
insegnamenti.put(codice, i);
return i;
}

Mesh89
05-11-2009, 19:55
Allora, innanzi tutto per favore edita il post e racchiudi il codice tra i tag CODE, perchè così non si capisce veramente nulla.

Secondo, che vuol dire "non funziona"? Non compila? Non trova ciò che dovrebbe trovare? Trova ciò che non dovrebbe trovare?

banryu79
06-11-2009, 09:17
Ragioniamo, un attimo.
Riepilogo la situazione: tu hai che un Corso è così definito: ha un nome, una descrizione, una relazione con l'offerta formativa di riferimento, e una collezione di insegnamenti.

class Corso
{
nome: String
descrizione: String
o : OffertaFormativa
inegnamenti: Map<String,Insegnamento>
}


Poi abbiamo che una offerta formativa è, mi par di capire, definita come una collezione di corsi e una collezione di docenti (gli altri membri, a naso, non mi sembra siano caratterizzanti: ad esempio "numerodocenti" non è neccessario, dato che questa info è implicitamente contenuta nella collezione di docenti, e quindi basta restituire il numero di docenti presenti con il metodo size()).

class OffertaFormativa
{
// membri caratterizzanti:
corsi: List<Corso>
docenti: List<Docente>
// membri non caratterizzanti, credo:
c: Corso
numerodocenti: int
oretot: int
}


Notiamo che un insegnamento ha un nome, un codice, e un numero di crediti (almeno è quello che di deduce esaminando la chiamata al costruttore di Insegnamento nel metodo "nuovoInsegnamento"):

class Insegnamento
{
codice: String
nome: String
crediti: int
}


Bene.
Esiste ora la necessità di creare e inserire un nuovo Insegnamento tra quelli già presenti, in un qualsiasi Corso.
Non vogliamo però introdurre in un Corso un Insegnamento duplicato.
Si deduce dal tuo post che un Insegnamento è considerato come il duplicato di un altro se hanno lo stesso codice, quindi l'identità di un Insegnamento è stabilità dal suo codice.

Analizziamo un po' la sistuazione:
- la classe Corso ha un metodo 'nuovoInsegnamento' che crea un nuovo oggetto Insegnamento e lo inserisce nella sua collezione di Insegnamenti, se i dati inseriti per il nuovo Insegnamento non definiscono un duplicato.
Inoltre il metodo restituisce al chiamante un l'Insegnamento appena creato: se però si sta definendo un duplicato, cosa dovrebbe restituire? Potrebbe restituire un riferimento nullo: in tal modo il chiamante può sapere se l'operazione è andata a buon fine o meno.

- la collezione di appoggio per gli Insegnamenti è una Map e la chiave è il codice dell'Insegnamento.

Potresti definire il tuo metodo così:

// in class Corso...
public Insegnamento nuovoInsegnamento(String codice, String nome, int crediti) {
Insegnamento nuovo = null;
if (! insegnamenti.containsKey(codice)) {
nuovo = new Insegnamento(codice,nome,crediti);
insegnamenti.put(codice, nuovo);
}
return nuovo;
}

Nota che appoggiandoti al metodo containsKey di Map, ed essendo le tue key di tipo String, il metodo per discriminare se un codice è uguale ad un altro (e quindi se una chiave è già presente nella mappa) è il metodo String.equals.
Questo implica che questi due codici risultano diversi: "GH2347" e "gH2347".

Nota che nel metodo non occorre lanciare alcuna eccezione: se la chiave è già presente è sufficiente restituire null al chiamante.

Se invece vuoi lanciare un'eccezione, puoi farlo, ma se l'eccezione che hai definito è una unchecked exception e il chiamante la ignora (non fa il try-catch) l'eccezione viene propagata (e se nessuno la intercetta arriva al "livello" del main, ma non impedisce alla tua applicazione di continuare a girare).