[Java] Uso dell'iteratore "doppio" confronto tra n e n+1

m45511
Sto cercando di risolvere la seguente consegna in Java:

Dato un insieme di persone, verificare se ci sono due persone con la stessa età

Il mio problema è che non riesco a capire come impostare l'iteratore, mi spiego meglio scrivendo il codice:

public static boolean stessaeta (Set db)
{
Iteratori=db.iterator();
while(i.hasnext())
{
Persona p= i.next()
//adesso come faccio a dire all'iteratore di confrontare la persona n con la persona n+1 della lista?
//risolto questo problema mi basta solo un if



Grazie per l'aiuto.

Risposte
apatriarca
Confrontare n con n+1 non è sufficiente per stabilire se ci sono o meno due persone con la stessa età. Il metodo più semplice è creare un secondo iteratore interno al ciclo e iterare su quello..

Cronovirus
Scusami.. ma non credo sia sufficiente confrontare l'n-esima persona con la n+1-esima.. Puoi vederlo benissimo considerando l'insieme <3,1,3>.
Detto questo potresti crearti un array in cui ci metti le occorrenze delle età, altrimenti ti serve un altro for innestato: per ogni persona cerchi su tutto l'insieme se un'altra ha la stessa età tipo
for(Per tutte le persone dell'insieme i){
  età = i.getEta();
  for(Per tutte le persone dell'insieme k tranne l'i-esima){
    if(k.getEta() == età)
      return true
  }
}

m45511
Grazie ho Caputo. Adesso mi sorge solo UN dubbio, io non sapendo quante persons ci

m45511
Come faccio a tradurre in codice questi intervalli sull'insieme persona per il for? Sulle slide ho solo esercizi con iteratore e while.

Cronovirus
In che senso? Come fare il for su tutte le persone? a dire la verità lo facevi già controllando i.hasNext()

m45511
Come faccio a fare questo for:
for(Per tutte le persone dell'insieme k tranne l'i-esima).

Cronovirus
Beh ma puoi usare il for o il while, se hai capito che devi ciclare su tutte le persone puoi farlo in un modo o nell'altro

m45511
"Cronovirus":
Beh ma puoi usare il for o il while, se hai capito che devi ciclare su tutte le persone puoi farlo in un modo o nell'altro


Allora mi spiego meglio, adesso sono da pc e sono comodo.

Iteratori=db.iterator();
while(i.hasnext())
persona p=i.next()

In questo modo scorro TUTTE LE PERSONE partendo dalla persona 0.
Allora per iniziare dalla persona 1(quella successiva a 0), come devo fare?
In c avrei usando una lista con puntatore del tipo s->next->next. Qui come devo fare?
Grazie per l'aiuto.

Cronovirus
Iteratori=db.iterator();
persona p = i.next()
while(i.hasnext())
p=i.next()

è la prima soluzione banale che puoi fare

m45511
"Cronovirus":
Iteratori=db.iterator();
persona p = i.next()
while(i.hasnext())
p=i.next()

è la prima soluzione banale che puoi fare


Grazie, ho optato per questa soluzione, cosa ne pensi?

pubblc static boolean stessaeta(Set db)
{
boolean result=true;
int eta=0;

iterator i =db.iterator();
if(i.hasnext()){
Persona p= i.next();
eta=p.geteta().iterator().next(); //ho dei dubbi sulla sintassi di questa espressione, cosa ne pensi?
//potevo anche scrivere semplicemente eta=p.geteta()?
}

while(i.hasnext())
{
Persona p=i.next();
if(eta==p.geteta())
result=false;
}

return result;
}

Cronovirus
"m4551":
[quote="Cronovirus"]Iteratori=db.iterator();
persona p = i.next()
while(i.hasnext())
p=i.next()

è la prima soluzione banale che puoi fare


Grazie, ho optato per questa soluzione, cosa ne pensi?

pubblc static boolean stessaeta(Set db)
{
boolean result=true;
int eta=0;

iterator i =db.iterator();
if(i.hasnext()){
Persona p= i.next();
eta=p.geteta().iterator().next(); //ho dei dubbi sulla sintassi di questa espressione, cosa ne pensi?
//potevo anche scrivere semplicemente eta=p.geteta()?
}

while(i.hasnext())
{
Persona p=i.next();
if(eta==p.geteta())
result=false;
}

return result;
}[/quote]

Così controlli solo che il primo elemento del set (non) abbia età uguale a qualche altra persona nel set.. Per quanto riguarda eta=p.geteta().iterator().next().. secondo me non ha senso. Hai provato ad eseguirlo?

m45511
"Cronovirus":
[quote="m4551"][quote="Cronovirus"]Iteratori=db.iterator();
persona p = i.next()
while(i.hasnext())
p=i.next()

è la prima soluzione banale che puoi fare


Grazie, ho optato per questa soluzione, cosa ne pensi?

pubblc static boolean stessaeta(Set db)
{
boolean result=true;
int eta=0;

iterator i =db.iterator();
if(i.hasnext()){
Persona p= i.next();
eta=p.geteta().iterator().next(); //ho dei dubbi sulla sintassi di questa espressione, cosa ne pensi?
//potevo anche scrivere semplicemente eta=p.geteta()?
}

while(i.hasnext())
{
Persona p=i.next();
if(eta==p.geteta())
result=false;
}

return result;
}[/quote]

Così controlli solo che il primo elemento del set (non) abbia età uguale a qualche altra persona nel set.. Per quanto riguarda eta=p.geteta().iterator().next().. secondo me non ha senso. Hai provato ad eseguirlo?[/quote]

Il problema è che non posso eseguirlo perchè dovrei fare i codici sorgente di ogni classe e delle gestione delle associazioni.
Non ho i mezzi per farlo.
Mi potresti scrivere un codice sorgente che risolva questa consegna in modo da prender spunto?
Ho mandato gli esercizi al professore ma non ho ricevuto risposta da giorni e non so dove mettere le mani :cry: :cry:

Cronovirus
Credo che sia più costruttivo per te implementare realmente quello che stai scrivendo.. Se non hai voglia di creare anche la classe persona con un metodo e un campo età puoi sostituirlo con un semplice int per provarlo.

Non è giustamente un esercizio sulle classi, puoi addirittura mettere tutto nel main, crei un set di int e provi a vedere se nel set ci sono due int uguali

m45511
"Cronovirus":
Credo che sia più costruttivo per te implementare realmente quello che stai scrivendo.. Se non hai voglia di creare anche la classe persona con un metodo e un campo età puoi sostituirlo con un semplice int per provarlo.

Non è giustamente un esercizio sulle classi, puoi addirittura mettere tutto nel main, crei un set di int e provi a vedere se nel set ci sono due int uguali


Adesso ci provo, intanto posto le soluzioni di altri due esercizi:

//Dato un insieme di studenti, cacolare la media delle loro età

public static float media (Set db)
{
int eta=0;
int n=0;
float result=0;

Iterator i=db.iterator();
while(i.hasNext(){
Studente s = i.next();
n++;
}
while(i.hasNext()){
Studente s= i.next();
eta+=s.getEta();
}
result=eta/n;
return result;
}

//Dato un insieme di studenti, restituire il numero di studenti che hanno sostenuto almeno 5 esami

public static int esami (Set db)
{
int a=0;

Iteratori=db.iterator();
while(i.hasNext()){
Studente s = i.next();
if(s.getEsami>=5)
a++;
}
return a;
}

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.