|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Registered User
Iscritto dal: Jul 2007
Messaggi: 915
|
[JAVA] merge sort: dove sbaglio?
Ho scritto questo codice che dovrebbe implementare l'algoritmo Merge Sort ma c'è qualcosa che non va:
Codice PHP:
Praticamente salta fuori una NullPointerException nel punto indicato nel sorgente (il problema è nel compareTo) e non riesco a sistemare... Forse è una stupidata ma con tutti quegli indici inizio a perdermi.. Grazie ![]() edit: ho poi un problema coi generici.. Ho bisogno di creare 2 vettori di tipo T ma a quanto pare non si puo'... :| Ho "risolto" con T[] leftArray = (T[]) new Comparable[length]; T[] rightArray = (T[]) new Comparable[length]; ma non mi pare una buona soluzione... Come si puo' fare in un modo un po' migliore? Ultima modifica di afsdfdlecosdfsfdcco : 09-02-2008 alle 21:46. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Diverse cose: innanzitutto non ci sarebbe alcun bisogno di creare degli array (nemmeno temporanei).
Come seconda cosa, limitare T in modo che debba essere per forza un Comparable, è troppo restrittivo. Arrays.sort() del collections framework infatti non fa così. C'è la versione che accetta Object[] e quella che accetta un T[] dove T può essere qualunque cosa, dedotta tramite inferenza. Non ci sono bounds. Per quella che prende un Object[], chiaramente nel metodo vengono fatti dei cast a Comparable ed è lì che bisogna essere certi che gli oggetti implementino davvero Comparable. Ma se io ti passo un Object[] me lo devi accettare, non rifiutare! Perché potrebbe contenere tutti String e sarebbe quindi corretto. Terza cosa, anche volendo passare la tua scelta di usare come upper bound un Comparable, la tua signature sarebbe ancora troppo ristretta. Si deve sempre mettere: .... Comparable<? super T> E se ti domandi perché, ti rispondo che c'è un ottimo motivo. Io potrei fare una classe base Veicolo che implementa Comparable<Veicolo> e poi fare 2 sottoclassi Automobile e Moto che NON implementano Comparable (anche perché non sarebbe possibile, non si possono implementare più interfacce che hanno la stessa erasure). Il risultato sarebbe che Automobile e Moto sono realmente Comparable, anche tra di loro (poi essendo Comparable su Veicolo, si presume che verranno comparati solo dati comuni in Veicolo, ovviamente). Ma la tua signature non accetterebbe un Automobile[] o Moto[], perché accetterebbe Automobile[] solo se Automobile fosse Comparable<Automobile> mentre invece, nel mio esempio sopra, Automobile è Comparable<Veicolo>. Troppo complicata la mia spiegazione?
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
#3 | |
Registered User
Iscritto dal: Jul 2007
Messaggi: 915
|
Quote:
![]() Ci devo lavorare sopra un pochetto ![]() Ehm... si, mi sono perso quasi subito ![]() Non ho molta esperienza coi generici ![]() Intanto grazie ^^ |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:02.