Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    2

    [Java] Uso interfaccia comparable

    Ciao a tutti! Sono uno studente universitario e ho qualche problema con l'uso dell'interfaccia Comparable.
    Vi allego un pezzo di codice di una ricerca lineare:

    codice:
    private int find(Object key)
    	{
    		for(int i=0; i<size; i++)
    		{
    			if (((Comparable)v[i].getKey()).equals(key)) return i;
    	
    		}
    		return -1;
    	}
    perchè è necessaria la forzatura usando (Comparable)? Nello specifico sia v[i].getkey() e key sono Object quindi non si tratta di un cast giusto?
    Grazie in anticipo!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Direi che quel cast (sì, è pur sempre un cast) è piuttosto inutile... l'interfaccia Comparable, infatti, prevede l'implementazione del metodo compareTo(), che qui non viene usato.

    Quindi, non vedo perchè castare l'oggetto a Comparable senza poi usarne il metodo compareTo(), se non per scopi di controllo sulla consistenza: se viene passato un oggetto non Comparable, viene sollevata una ClassCastException.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157

    Re: [Java] Uso interfaccia comparable

    Originariamente inviato da panoss
    Ciao a tutti! Sono uno studente universitario e ho qualche problema con l'uso dell'interfaccia Comparable durante l'ordinamento di oggetti senza usare classi esterne alla java.lang

    codice:
    private int find(Object key)
    	{
    		for(int i=0; i<size; i++)
    		{
    			if (((Comparable)v[i].getKey()).equals(key)) return i;
    	
    		}
    		return -1;
    	}
    perchè è necessaria la forzatura usando (Comparable)? Nello specifico sia v[i].getkey() e key sono Object quindi non si tratta di un cast giusto?
    Grazie in anticipo!

    quando hai di questi dubbi analizza piano piano la funzione che esegui:

    tu fai questo controllo qui


    codice:
    ((Comparable)v[i].getKey()).equals(key)
    dal quale ho eliminato già una parentesi.

    Poi prendi un oggetto (su cui chiami equals) e l'oggetto è questo qui

    codice:
    ((Comparable)v[i].getKey())
    anche qui inizia ad isolarlo,
    vi[i] da qui prendi l'oggetto key, dici al runtime di considerarlo un oggetto di tipo Comparable e a questo punto ci chiami sopra equals. Key (che passi come parametro nell'equals, ha le stesse caratteristiche dell'oggetto in questione.

    Quella notazione è del tutto equivalente a

    codice:
    {
    		for(int i=0; i<size; i++)
    		{
                            Object temp = v[i].getKey(); 
                            Comparable comp = (Comparable) temp; 
    			if  (comp.equals(key)) return i;
    	
    		}
    		return -1;
    	}
    In realtà il cast lo fai, ma come ti dice LeleFt perdi il vantaggio del Comparable proprio perché alla fine non usi compareTo.
    RTFM Read That F*** Manual!!!

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    2
    Grazie mille!
    E nel caso di un programma tipo:
    codice:
    private int find(Object key)
    	{
    		for(int i=0; i<size; i++)
    		{
    			if (((Comparable)v[i].getKey()).compareTo(key)>0) return i;
    	
    		}
    		return -1;
    	}
    La cosa è utile (o funziona) solo se nell'oggetto è stato sovrascritto il metodo compareTo?

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    se hai comparable allora hai sicuramente compareTo (visto che Comparable è una interfaccia).
    Ti potresti preoccupare dell'altra classe, ma una corretta implementazione di compareTo chiede anche il controllo dell'uguaglianza delle classi, quella corrente e quella dell'oggetto passato come parametro, per capire il confronto ha senso tra cipolle, non tra patate e cipolle!
    RTFM Read That F*** Manual!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.