Il metodo compareTo() e gestione eccezioni java
Ciao sto studiando il metodo compareTo() delle classe Comparable del Collection Framework di Java. Ho parecchi dubbi su un concetto;
....
public int compareTo(Object b){
Person p = (Person)b;
....
Allora ho cercato di capire sta cosa ma non ne trovo il senso ...la trovo su tutti gli esempi...potete spiegarmi chiaramente a cosa serve e se e' indispensabile .....grazie in anticipo ....
....
public int compareTo(Object b){
Person p = (Person)b;
....
Allora ho cercato di capire sta cosa ma non ne trovo il senso ...la trovo su tutti gli esempi...potete spiegarmi chiaramente a cosa serve e se e' indispensabile .....grazie in anticipo ....
Risposte
"valentinax89":
Ciao sto studiando il metodo compareTo() delle classe Comparable del Collection Framework di Java. Ho parecchi dubbi su un concetto;
....
public int compareTo(Object b){
Person p = (Person)b;
....
Allora ho cercato di capire sta cosa ma non ne trovo il senso ...la trovo su tutti gli esempi...potete spiegarmi chiaramente a cosa serve e se e' indispensabile .....grazie in anticipo ....
Lo scopo d'uso dell'interfaccia Comparable è quello di indurre un'ordinamento sulle istanze di ogni classe che implementa tale interfaccia.
Una classe che implementa Comparable deve ridefinire il metodo compareTo, nel quale definisce la relazione d'ordine tra le sue istanze.
Nello specifico, se il metodo restituisce:
- 0, allora le istanze confrontate sono uguali.
- intero positivo (solitamente 1), allora l'istanza sulla quale viene invocato il metodo è maggiore dell'argomento.
- intero negativo (solitamente -1), allora l'istanza corrente è minore dell'argomento.
Nel caso dell'esempio, la classe Person implementa l'interfaccia Comparable:
l'argomento b deve necessariamente essere una istanza di Person che deve essere confrontata con l'istanza corrente, cioè l'istanza sulla quale viene invocato il metodo compareTo.
Se, ad esempio, la classe Person annovera tra i suoi campi d'esemplare la proprietà età, allora si potrebbe pensare di basare/indurre l'ordinamento secondo tale campo.
Quindi, l'implementazione del metodo sarebbe la seguente:
public int compareTo(Object b) { Person p = (Person)b; return this.eta - p.eta; }
Adesso, prova ad istanziare tanti oggetti della classe Person e li metti in una qualche struttura lineare (array, liste, o altro) e ordina tale struttura.
Stampando ogni elemento all'interno della struttura ti accorgi che le varie persone sono state ordinate per età.
N.B. Se vuoi risparmiarti il cast all'interno del metodo compareTo puoi ricorrere alle Generics:
public class Person implements Comparable<Person>{ // ... @Override public int compareTo(Person b) { // ... } }
Grazie per la risposta molto completa....infatti mi creava confusione anche il discorso dei tipo generici......grazie un bacio ....

"valentinax89":
Grazie per la risposta molto completa....infatti mi creava confusione anche il discorso dei tipo generici......grazie un bacio ....
Di nulla

Ciao scusa se rompo ancora ma avrei un altro problemino .....questa volta con le eccezioni....
Quando creo un eccezione "mia" ho guardato un po' di materiale in giro ....e ad esempio
(questa l'ho creata io quindi non so' quanto sia giusta!)
class ComandoErratoException extends NoSuchElementException(){
public ComandoErratoException (){ super();}
public ComandoErratoException (String s){
super(s);
}
Ma non sono riuscita a trovare spiegazioni piu' dettagliate.... Ho capito che per fare un eccezione devo estendere la classe Exception o una delle sue sottoclassi ma nil mio problema e' che non riesco proprio a capire il senso dei due costruttori...
Quando creo un eccezione "mia" ho guardato un po' di materiale in giro ....e ad esempio
(questa l'ho creata io quindi non so' quanto sia giusta!)
class ComandoErratoException extends NoSuchElementException(){
public ComandoErratoException (){ super();}
public ComandoErratoException (String s){
super(s);
}
Ma non sono riuscita a trovare spiegazioni piu' dettagliate.... Ho capito che per fare un eccezione devo estendere la classe Exception o una delle sue sottoclassi ma nil mio problema e' che non riesco proprio a capire il senso dei due costruttori...
"valentinax89":
Ciao scusa se rompo ancora ma avrei un altro problemino .....questa volta con le eccezioni....
il mio problema e' che non riesco proprio a capire il senso dei due costruttori...
Il costrutto super() serve per chiamare il costruttore della superclasse.
In Java, all'atto dell'istanziazione di una classe vengono istanziate tutte le sue classi antenate a partire dalla classe radice (Object).
Per quanto riguarda il primo costruttore:
public ComandoErratoException (){ super(); }
puoi anche omettere super(), in quanto il compilatore aggiungerà automaticamente la chiamata al costruttore a zero argomenti della superclasse.
Ok ho capito grazie nuovamente.
Ma visto che sei un esperto ti pongo un'altra domanda (non vorrei approffittarne!!)...
Allora ho creato una HashMap.... funziona tutto il programma ma quando cerca il valore di una chiave che e' di tipo String non trova le chiavi che hanno spazi bianchi es. ("Aggiungi titolo") ...
Lo fa con tutte le stringhe con spazi... perche'??
Ma visto che sei un esperto ti pongo un'altra domanda (non vorrei approffittarne!!)...
Allora ho creato una HashMap
Lo fa con tutte le stringhe con spazi... perche'??
Ci mostreresti il codice?
Eccolo non e' finito pero'....
import java.util.*; import java.io.*; //__________________________________________________________________________________________________ public class Vid { public static void main(String[] args) { System.out.println(". . . . . . . . . "); Comandi(); } private static final void Comandi() { Map<String,Integer> comandi = new HashMap<String,Integer>(); comandi.put("ESCI", 0); comandi.put("AGGIUNGI VIDEO", 1); comandi.put("ELIMINA VIDEO", 2); comandi.put("TRANSAZIONE", 3); comandi.put("STORICO", 4); comandi.put("LISTA", 5); comandi.put("STATO", 6); c = Controllo.digita(comandi); switch(c) {case 0: System.out.println("Hai scelto il comando " + c); break; case 1: System.out.println("Hai scelto il comando " + c); break; case 2: System.out.println("Hai scelto il comando " + c); break; case 3: System.out.println("Hai scelto il comando " + c); break; case 4: System.out.println("Hai scelto il comando " + c); break; case 5: System.out.println("Hai scelto il comando " + c); break; case 6: System.out.println("Hai scelto il comando " + c); break; } System.out.println("---------------------"); System.out.println("---------------------"); } private boolean corretto = false; public static int c; } //_________________________________________________________________________________________________ class Controllo { public static int digita(Map<String,Integer> comandi) throws ComandoErratoException { Scanner in = new Scanner(System.in); while(!corretto) { String comando = in.next(); try { if (comandi.containsKey(comando) ) { valore= comandi.get(comando); corretto = true; } } catch(ComandoErratoException e){ System.out.println("COMANDO ERRATO!!!...");} } return valore; } private static boolean corretto = false; public static int valore; } //_________________________________________________________________________________________________ class ComandoErratoException extends NoSuchElementException { public ComandoErratoException (){} public ComandoErratoException (String s) { super(s); } }
Inserisci il codice all'interno del tag code in modo da mantenere la formattazione. Questa volta l'ho fatto io. Il metodo next() della classe scanner restituisce una parola non contenente spazi. Ti consiglio di usare al suo posto il metodo nextLine() che restituisce tutta una riga (quindi anche gli spazi).
Ok scusami e grazie !
Scusatemi ho un altro dubbio:
Nel codice quando catturo l'eccezione non mi visualizza "COMANDO ERRATO" perche'?
Nel codice quando catturo l'eccezione non mi visualizza "COMANDO ERRATO" perche'?
Non viene stampato quel messaggio perché l'eccezione che cerchi di catturare non è mai stata lanciata. Non dovresti comunque secondo me usare le eccezioni per qualcosa di non "eccezionale". È cioè facile che qualcuno sbagli a scrivere un comando.
Come dovrei fare? Nel senso voglio che se immetto un comando sbagliato venga catturata l'eccezione ma non voglio che si blochhi l'esecuzione. Ho provato a mettere throw ma si blocca l'esecuzione. Non ho capito molto dell'eccezioni...
Ho capito ora...grazie cmq per tutto!!!!