Quote Originariamente inviata da andbin Visualizza il messaggio
Sì, ma il concetto "senza duplicati" è secondo il criterio fornito dal comparator, quindi sul prezzo. Se hai 3 prodotti con lo stesso prezzo, tiene solo il primo trovato e gli altri li ignora. È davvero quello che vuoi? (giusto per capire io)


Ok, se è un requisito ... ovviamente, no prob!


Scusa se ti segnalo queste cose ma è doveroso farlo:

- le tue classi fanno "troppe" cose, si occupano anche della interazione (con input!) verso l'utente. Non vanno affatto bene.
E il fatto poi che l'input lo fai nei setPrezzo/setSconto è decisamente brutto e poco pulito, soprattutto per quei try-catch in cui oltretutto invochi ricorsivamente il metodo (noooooo!).

- in setPrezzo di Prodotto prima fai l'assegnamento poi il controllo per negativo. Magari è meglio il contrario! Altrimenti il vincolo non è poi così un vincolo ... sì lanci una eccezione ma lo stato dell'oggetto in quel momento è cambiato.

- abituati e tenere le variabili di istanza tipicamente 'private'.

E ora veniamo al punto importante: getPrezzo in ProdottoScontato è un "override" di quello in Prodotto. Se hai una variabile di tipo Prodotto ma che fa riferimento ad un oggetto ProdottoScontato e invochi prod.getPrezzo(), il getPrezzo invocato è quello dell'oggetto realmente istanziato, ovvero del ProdottoScontato.
In sostanza, il comparatore, comparando i prezzi, concettualmente compara prezzi normali con prezzi "scontati".

E tra l'altro, perché fai:

sconto * 100 / super.getPrezzo()

?? Questo non applica uno sconto ... non ha molto senso ....
1) Non risponderò alle tue segnalazioni non perchè non siano giuste ma perchè fuorvianti rispetto alla domanda principale a cui non siamo ancora riusciti a dare una risposta. Non voglio giustificare le mie scelte, se è per questo ci sono troppe eccezioni, l'input doveva essere da un'altra parte ecc ecc, ma per ora fa nulla.
2) si hai ragione non avevo notato che eliminasse quelli con lo stesso prezzo, teoricamente doveva eilimanre quelli con lo stesso codice, non avevo pensato che lui eilima quei elementi per i quali il comparator ritorna 0. Vabbe risolviamo facilmente sostituendo al TreeSet un ArrayList e inserendo solo gli elementi che non risultano uguali attraverso il metodo equals, e poi la ordino il .sort() 3) Anche qui hai ragione, ho sbaglaito la formula, errore di distrazione..
4) Si, so come funziona l'overide, ed era proprio questo lo scopo, confrontare il prezzo finale di ogni prodotto, quindi il prezzo scontato per gli oggetti ProdottoScontato ed il prezzo non scontato per gli oggetti Prodotto.
5)Tutto ciò però non mi spiega perchè mi ordina i ProdottoScontato in ordine crescente ed i Prodotto in ordine decrescente, sempre per prezzo..