Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    20

    OBJECT

    Sto implementando l'ADT code a priorità, ma mi trovo in questo dubbio:

    in generale ogni elemento della mia sequenza di valori è costituito da due campi object, che sono key e element.

    Dovrei comparare (confrontare) due elementi in base al loro valore key, ma se è dichiarato Object come faccio? (si può fare il casting)

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Manca il linguaggio, ed il titolo è assolutamente non conforme al regolamento.


    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 2004
    Messaggi
    20

    Conversione di un Object ad intero

    Scusatemi, per l'inconventiente, ecco il codice incriminato:

    Questa è la classe Item:

    public class Item {
    private Object elem;
    private Object key;

    protected Item (Object k, Object e) {
    key = k;
    elem = e;
    }

    public Object key() {
    return key;
    }
    public Object element() {
    return elem;
    }

    public void setKey(Object k) {
    key = k;
    }

    public void setElement(Object e) {
    elem = e;
    }
    }


    Ecco la classe che implementa il comparatore:
    public class TheComparator implements Comparator{
    Object ea, eb, keya, keyb;
    //Compariamo gli elementi in base al loro valore di key
    private void getXY(Object a, Object b) {
    if(a==null || b==null)
    throw new InvalidElementException("Argomento nullo");
    try {
    keya = ((Item) a).key();
    ea = ((Item) a).element();
    keyb = ((Item) b).key();
    eb = ((Item) b).element();
    }
    catch (ClassCastException e)
    { throw new InvalidElementException("Argomento non è un Item");}
    }

    public boolean isLessThan(Object a, Object b) {
    getXY(a, b);
    return (keya < keyb);
    }
    ............................

    Come faccio a confrontare keya e keyb (che sono Object) ma contengono valori interi?

    Grazie...

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Manca comunque il linguaggio, anche se si capisce che si tratta di Java.

    Allora, per il confronto devi agire utilizzando il cast:
    codice:
    public boolean isLessThan(Object a, Object b) { 
       getXY(a, b);
       return (((Integer) keya).intValue() < ((Integer) keyb).intValue()); 
    }
    PS: Ricordati di inserire il codice all'interno dei tag che compaiono premendo sul pulsante CODE quando scrivi il messaggio.


    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

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    20
    FUNZIONA VVoVe:

    Ti ringrazio Lele...

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    20
    Come non detto, la classe TheComparator mi viene compilata ma testandola mi da questo errore:Hit uncaught exception java.lang.ClassCastException

    Questa è la classe TheComparator:

    codice:
    public class TheComparator implements Comparator{
      Object ea, eb, keya, keyb;
      //Compariamo gli elementi in base al loro valore di key
      private void getXY(Object a, Object b) {
        if(a==null || b==null)
          throw new InvalidElementException("Argomento nullo");
        try {
          keya = ((Item) a).key();
          ea = ((Item) a).element();
          keyb = ((Item) b).key();
          eb = ((Item) b).element();
        }
        catch (ClassCastException e)
        { throw new InvalidElementException("Argomento non è un Item");}
      }
    
      public boolean isLessThan(Object a, Object b) {
        getXY(a, b);
        return (((Integer) keya).intValue() < ((Integer) keyb).intValue());
      }
    
      public boolean isLessThanOrEqualTo(Object a, Object b) {
        getXY(a, b);
        return (((Integer) keya).intValue() <= ((Integer) keyb).intValue());
      }
    ......
    a e b sono i due oggetti Item, per cui dal debug leggo che le variabili keya e keyb contengono i valori, "43" e "42", ma

    codice:
    public boolean isLessThanOrEqualTo(Object a, Object b) {
        getXY(a, b);
        return (((Integer) keya).intValue() <= ((Integer) keyb).intValue());   }
    La linea in grassetto crea l'eccezione perchè probabilmente non può esser fatto il casting.

    cos'è che non va?

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    C'è che non so che oggetti ritorna il metodo key() dell'oggetto Item.
    Pensavo che ritornasse degli oggetti di tipo Integer, ma a quanto pare era una supposizione errata.
    Solo tu sai che tipo di oggetto restituisce il metodo key(). Quindi casta gli oggetti keya e keyb nel tipo giusto.


    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

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    20
    Originariamente inviato da LeleFT
    C'è che non so che oggetti ritorna il metodo key() dell'oggetto Item.
    Pensavo che ritornasse degli oggetti di tipo Integer, ma a quanto pare era una supposizione errata.
    Solo tu sai che tipo di oggetto restituisce il metodo key(). Quindi casta gli oggetti keya e keyb nel tipo giusto.


    Ciao.
    key() ritorna come intero, la chiave associata all'elemento e.
    Se key() ritorna un Object, come faccio a convertirlo in intero per confrontarlo?

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Allora... c'è da dire che molte persone considerano gli int e gli Integer come delle cose assolutamente identiche ed interscambiabili.

    Invece non è così: int è un tipo di dato cosiddetto primitivo, mentre Integer è un oggetto e le due cose sono profondamente diverse.

    Questo significa che ci sono vari modi per rappresentare un intero: tramite una variabile di tipo int, oppure tramite un oggetto.
    Java offre una classe apposita (detta wrapper) per gli interi chiamata Integer, ma nessuno mi vieta di crearmene una io:
    codice:
    public class MioIntero {
       private int intero;
       public MioIntero(int intero) { this.intero = intero; }
       public int getIntero() { return intero; }
       public String toString() { return "" + intero; }
    }
    Se io stampo un oggetto di questa classe con un System.out.println() vedrò apparire a video il numero che rappresenta, ma ciò non toglie che io non sto lavorando con un intero, ma con un oggetto di tipo MioIntero.

    Ora, io non so cosa ritorna il metodo key(), questo devi dirmelo tu.
    Se ritorna un intero, nel senso che ritorna un int, allora il metodo getXY() fa qualcosa di estremamente sbagliato: tenta di assegnare un intero ad un oggetto!!
    Se, invece, ritorna un oggetto che "rappresenta" un intero, allora il discorso è diverso.
    Per sapere che tipo di oggetto ritorna puoi utilizzare questa istruzione:
    codice:
    System.out.println(keya.getClass());
    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

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 © 2024 vBulletin Solutions, Inc. All rights reserved.