Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2015
    Messaggi
    107

    Utilizzare HashMap come attributo di una classe

    Salve,

    Devo realizzare un servizio REST che permetta di gestire un dizionario di parole dove dovrà essere possibile:Inserire una parola e la sua definizione --> metodo Dizinario(String String).
    Data una parola, visualizzare la sua definizione --> metodo getDefinition(String).

    Mi è stato detto di usare l'HashMap per far combaciare una parola col sue significato ma mi sta dando problemi, in particolare: incompatible types: java.lang.String cannot be converted to int. Non penso sia solo questo il problema dato è la prima volta che uso questa struttura.

    codice:
    package beans;
    
    /**
     * Created by civi on 26/04/16.
     */
    
    import javax.xml.bind.annotation.XmlRootElement;
    import java.util.HashMap; // import the HashMap class
    
    /**
     *
     */
    @XmlRootElement
    public class Word {
    
        private HashMap<String, String> listaWord = new HashMap<String, String>();
        private String parola;
        private String definizione;
    
        public Word(){}
    
        public Word(String parola, String definizione) {
            listaWord.add(new HashMap(parola, definizione));
    }
    
        public String getDef(String parola) {
            return listaWord.get(parola);
    }
    
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da ROCCHEFILI Visualizza il messaggio
    Mi è stato detto di usare l'HashMap per far combaciare una parola col sue significato ma mi sta dando problemi, in particolare: incompatible types: java.lang.String cannot be converted to int. Non penso sia solo questo il problema dato è la prima volta che uso questa struttura.
    Alt. Ci sono prima alcune questioni da chiarire.

    Innanzitutto vedo che hai usato JAXB (l'annotation @XmlRootElement). Quindi hai un XML da "mappare" su delle classi? Non hai parlato di XML in effetti ...

    Se hai un XML da trattare, devi fare un marshalling (ovvero generare il XML dagli oggetti) o (/e) un unmarshalling (ovvero leggere il XML e generare gli oggetti)?

    Seconda cosa, quella classe Word cosa dovrebbe rappresentare? Perché vedo che contiene parola-definizione ma anche una mappa. Quindi?
    Deve rappresentare 1 associazione ... o N? (se l'hai messa come "root" è poco presumibile che rappresenti solo 1 associazione, tra l'altro)

    Comunque, per chiarire, descrivi bene cosa hai in mano o stai cercando di fare, da cosa parti e dove vuoi arrivare ...



    P.S. per cortesia, non mettere codice "colorato" con i tag [ COLOR ]. E' un gran disastro quotarlo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303
    PPS: l'inserimento nelle mappe si fa usando il metodo put(key, value) che associa ad una chiave il relativo valore... HashMap non ha alcun metodo add ed il costruttore di HashMap con due parametri vuole come primo parametro, appunto, un int che indica la capacità iniziale, mentre il secondo dev'essere un float che rappresenta il loadFactor... non ti serve proprio questo costruttore.
    "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

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2015
    Messaggi
    107
    Si come dici tu le parole vanno inserite e restituite con xml/json. A lezione se ho capito bene ci hanno spiegato questo marshalling e unmarshalling viene fatto sui javabean da jaxb.
    La classe Word deve rappresentare una parola definita da un nome e una definizione, la mappa la voglio utilizzare per garantire che ad una parola venga associata una sola definizione senza.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2015
    Messaggi
    107
    Provando a non utilizzare le mappe:
    codice:
    package beans;
    
    
    import javax.xml.bind.annotation.XmlRootElement;
    
    
    @XmlRootElement
    public class Word {
    
    
        private String parola;
        private String definizione;
    
    
        public Word(){}
    
    
        public Word(String parola, String definizione) {
            this.parola = parola;
            this.definizione = definizione;
        }
    
    
        public String getDef() {
            return definizione;
        }
    
    
        public void setDef(String definizione) {
            this.definizione = definizione;
        }
    }
    codice:
    package beans;
    
    
    import java.util.ArrayList;
    import java.util.List;
    
    
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;
    
    
    @XmlRootElement
    @XmlAccessorType (XmlAccessType.FIELD)
    public class Words {
    
    
        @XmlElement(name="words")
        private List<Word> wordslist;
        private static Words instance;
    
    
        public void Users() {
            wordslist = new ArrayList<Word>();
        }
    
    
        //singleton
        public synchronized static Words getInstance(){
            if(instance==null)
                instance = new Words();
            return instance;
        }
    
    
        public synchronized List<Word> getWordslist() {
            return new ArrayList<>(wordslist);
        }
    
    
        // public void setWordslist(List<Word> wordslist) {this.wordslist = wordslist;}
    
    
        public synchronized void  add(Word w){ wordslist.add(w); }
    
    
        /*public User getByName(String name){
    
    
            List<User> usersCopy = getUserslist();
    
    
            for(User u: usersCopy)
                if(u.getName().toLowerCase().equals(name.toLowerCase()))
                    return u;
            return null;
        }*/
    
    
    }
    codice:
    package services;
    
    
    
    
    import beans.Word;
    import beans.Words;
    
    
    import javax.ws.rs.Consumes;
    import javax.ws.rs.GET;
    import javax.ws.rs.POST;
    import javax.ws.rs.Path;
    import javax.ws.rs.PathParam;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.Response;
    
    
    @Path("words")
    public class WordsService {
    
    
        //restituisce la lista di parole
        @GET
        @Produces({"application/json", "application/xml"})
        public Response getWordsList(){
    
    
            return Response.ok(Words.getInstance()).build();
    
    
        }
    
    
        //permette di inserire una parola (nome e definizione)
        @Path("add")
        @POST
        @Consumes({"application/json", "application/xml"})
        public Response addWord(Word w){
            Words.getInstance().add(w);
            return Response.ok().build();
        }
    
    
    
    
    }

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da ROCCHEFILI Visualizza il messaggio
    Provando a non utilizzare le mappe:
    No, mi spiace, secondo me non ci siamo.
    Innanzitutto in Words quel private static Words instance con getInstance(), synchronized di qua e di là, ecc.. semplicemente non ha proprio granché senso.

    E poi comunque hai ben chiara la struttura di XML/JSON che vuoi generare o ricevere?

    Se sì, mostraci un esempio di XML/JSON che vuoi trattare.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2015
    Messaggi
    107
    Quote Originariamente inviata da andbin Visualizza il messaggio
    No, mi spiace, secondo me non ci siamo.
    Innanzitutto in Words quel private static Words instance con getInstance(), synchronized di qua e di là, ecc.. semplicemente non ha proprio granché senso.

    E poi comunque hai ben chiara la struttura di XML/JSON che vuoi generare o ricevere?

    Se sì, mostraci un esempio di XML/JSON che vuoi trattare.
    Il codice del singleton l'ho copiato pari pari dal mio professore.
    Comunque quello che voglio inserire è, utilizzando Advance REST Client è tramite metodo POST e url http://localhost:1337/words/add un body con una struttura json tipo:
    {
    "parola": "soleggiato",
    "definizione": "Esposto alla luce e al calore del sole, assolato."
    }

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da ROCCHEFILI Visualizza il messaggio
    Il codice del singleton l'ho copiato pari pari dal mio professore.
    Sì ma non va proprio granché bene un "singleton" che è la stessa classe che usi per modellare i dati in input/output.

    Dovresti cercare di separare/distinguere quella che può essere la "base dati" (che può essere benissimo "in memoria" come esercitazione) dalla/e struttura/e usata/e per passare avanti e indietro i dati.

    Quote Originariamente inviata da ROCCHEFILI Visualizza il messaggio
    un body con una struttura json tipo:
    {
    "parola": "soleggiato",
    "definizione": "Esposto alla luce e al calore del sole, assolato."
    }
    E questo va bene, è semplice e basta 1 classe per modellare questo JSON. Tra l'altro, per JSON quale libreria intendi usare? La Jackson? Gson? (nota: la API JAXB è solo per XML).


    P.S. un "add" nel url non è molto "REST" ma passiamolo ..
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2015
    Messaggi
    107
    Quote Originariamente inviata da andbin Visualizza il messaggio

    Dovresti cercare di separare/distinguere quella che può essere la "base dati" (che può essere benissimo "in memoria" come esercitazione) dalla/e struttura/e usata/e per passare avanti e indietro i dati.
    E come faccio a fare questo?
    E questo va bene, è semplice e basta 1 classe per modellare questo JSON. Tra l'altro, per JSON quale libreria intendi usare? La Jackson? Gson? (nota: la API JAXB è solo per XML).
    Da poco è possibile utilizzare anche json in jaxb
    P.S. un "add" nel url non è molto "REST" ma passiamolo ..
    lo so sono agli inizi

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da ROCCHEFILI Visualizza il messaggio
    E come faccio a fare questo?
    Concentrati ad esempio sulla parte interna. Devi creare un "dizionario". Quindi meglio fare una classe apposita es. Dictionary. Cosa deve fare? Aggiungere una entry (parola-definizione), rimuovere una entry, ottenere ("velocemente") una entry data una parola. Ecc... basta che pensi a COSA deve fare un Dictionary.
    E tutto questo potrebbe NON necessariamente avere a che fare con la mappatura in XML/JSON.

    Quote Originariamente inviata da ROCCHEFILI Visualizza il messaggio
    Da poco è possibile utilizzare anche json in jaxb
    Se ti riferisci ad esempio alla implementazione di JAXB fatta da EclipseLink (si chiama MOXy se non sbaglio), sì certo, può trattare anche JSON. Mi è capito di leggere qualcosa qua e là ma non ne so molto.
    Comunque è una implementazione. Non lo standard. La implementazione di JAXB incorporata nel JDK ad esempio tratta solo XML.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

Tag per questa discussione

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.