Java Map

di il
24 risposte

Java Map

Buon pomeriggio signori.
sono nuovo e mi scuso se non son passato nella sezione apposita per presentarmi
vorrei comunque esporre la mia perplessità.
permettetemi di premettere che sono un programmatore java in erba, ma molto "precoce"
ultimamente mi chiedevo se fosse possibile assegnare un nome dinamico nella multicreazione di oggetti, con un ciclo for per esempio, e la risposta mi è stata data dalla classe MAP.
la teoria l'ho capita, correggetemi se sbaglio, sostanzialmente essendo un oggetto un puntatore nella memoria, e il nome dell'oggetto una semplice "maschera", un qualcosa di astratto, non posso fare una multicreazione dinamica. per ovviare si ricorre alla classe map che sostanzialmente associa quel puntatore a una chiave, che verrà poi richiamata.
se il concetto l'ho capito bene quindi io prima devo creare un oggetto mappa e poi con quello posso procedere alla multicreazione di oggetti
(non chiedetemi l'utilità di una cosa simile, mi piacciono le cose curiose, strane, e questo fatto ha attirato il mio interesse)
quella che non mi è chiara è la parte di codice
se io per esempio avessi la mia classe, per esempio Cubo.java, e la mia classe Test.java con il main, qual è il codice da usare per poter fare quanto detto sopra?
qualcuno sarebbe così gentile da farmi un esempio di codice usando nomi reali, e spiegandomelo per favore?

24 Risposte

  • Re: Java Map

    KuroKami69 ha scritto:


    mi chiedevo se fosse possibile assegnare un nome dinamico nella multicreazione di oggetti
    Detto così, purtroppo vuol dire poco/nulla.

    KuroKami69 ha scritto:


    sostanzialmente essendo un oggetto un puntatore nella memoria
    Un oggetto non è un "puntatore". Nel campo C/C++ un puntatore è una variabile che contiene l'indirizzo di memoria di un valore disposto da qualche parte nella memoria.
    In Java non ci sono i "puntatori" (non certo come in C/C++). Ci sono variabili reference il cui contenuto è un valore che fa riferimento ad un oggetto allocato sul heap-space (oppure vale null = nessun oggetto referenziato).
    In Java i reference sono qualcosa di molto "opaco" nel senso che il valore del reference non è un numero che puoi manipolare, non è "stampabile" e non ci puoi fare praticamente quasi nulla (a parte assegnarlo ed usarlo ovviamente per accedere a campi/metodi dell'oggetto). E quanto è grande un reference (quanto occupa in bit) non lo si sa a priori, dipende dalla implementazione della JVM.

    KuroKami69 ha scritto:


    e il nome dell'oggetto una semplice "maschera", un qualcosa di astratto
    Gli oggetti non hanno nome ... sono le variabili che hanno un nome.

    KuroKami69 ha scritto:


    non posso fare una multicreazione dinamica.
    Ripeto che "multicreazione dinamica" dice poco/nulla.

    KuroKami69 ha scritto:


    per ovviare si ricorre alla classe map che sostanzialmente associa quel puntatore a una chiave, che verrà poi richiamata.
    Le Map sono strutture dati che associano appunto un valore ad una chiave. Questo NON vuol dire che crei "dinamicamente" delle variabili, né nuovi nomi (il fatto che una chiave possa essere una stringa, è solo una delle eventualità).

    KuroKami69 ha scritto:


    quella che non mi è chiara è la parte di codice
    import java.util.HashMap;
    import java.util.Map;
    
    public class Prova {
        public static void main(String[] args) {
            Map<String,Integer> mappa = new HashMap<String,Integer>();
    
            mappa.put("primoValore", new Integer(123));
            mappa.put("secondoValore", new Integer(456));
        }
    }
  • Re: Java Map

    Bhe ti ringrazio (molto bello il micio)
    a quanto pare ho ancora molta confusione in testa ahahha *sad*
    comunque con multicreazione dinamica intendevo inserire il map.put in un for e implementarci la creazione di un oggetto.
    qualcosa tipo
    
    Map<String, String> mappa = new HashMap<String, String>();
    
    for (int i = 0; i < 5; i++)
    {
    	Cubo mappa.put("c"+1, new String()) = new Cubo
    }
    
    una cosa simile è possibile?
  • Re: Java Map

    A parte il fatto che sintatticamente questo statement, almeno in Java, non ha senso
    
    Cubo mappa.put("c"+1, new String()) = new Cubo
    
    CHE COSA vorresti fare?

    Premettiamo che Java e' un linguaggio TIPATO, dove le variabili hanno un TIPO definito in fase di dichiarazione.
    Questo vuol dire che i TIPI dei valori che puoi assegnare ad una variabile sono STRETTAMENTE legati al TIPO della variabile. Che poi le regole siano piu' o meno complicate, e' un'altra questione.

    Al contrario, i linguaggi NON TIPATI, come Python (ed altri), la variabile NON HA UN TIPO PREDEFINITO e puo' contenere un qualunque TIPO DI VALORE: una stringa, ma anche un intero o un oggetto di qualunque classe.

    Per loro natura, il linguaggi NON TIPATI non sono adatti a fare cose molto complesse:
    1) non sfrutti il compilatore per capire se stai facendo pasticci, oltre a quelli che si fanno normalmente quando uno programma (alle prime armi o meno)
    2) non sono efficienti, perche' non e' possibile sapere a priori il tipo del valore trattato e quindi, ad esempio, se una certa operazione va eseguita su interi, numeri con virgola, stringhe o oggetti

    La tendenza attuale e' quella di avere linguaggi TIPATI che SEMBRANO NON TIPATI: lo stanno facendo in C++ con la keyword auto, C# con var, e Scala, con var e val. Ma questo puo' essere fatto SOLO PERCHE' il compilatore integra un potente sistema di deduzione dei tipi.
  • Re: Java Map

    Ok cerco di essere più chiaro possibile
    ho, per esempio, la classe cubo ok?
    ora voglio creare 5 oggetti cubo, e anziché fare
    
    Cubo c = new cubo();
    Cubo c1 = new cubo();
    Cubo c2 = new cubo();
    Cubo c3 = new cubo();
    Cubo c4 = new cubo();
    
    vorrei crearli tramite un ciclo for.
    da quello che ho capito usando la classe map, dovrebbe essere possibile farlo giusto? solo che non ho capito bene come
    quello che volevo sapere io, era appunto se era possibile e come
  • Re: Java Map

    KuroKami69 ha scritto:


    ho, per esempio, la classe cubo ok?
    ora voglio creare 5 oggetti cubo
    [...]
    vorrei crearli tramite un ciclo for.
    Ma dipende da COSA ci devi poi fare! Ti basta un array? Allora NON ti serve una mappa. Vuoi invece che ad ogni oggetto Cubo sia associato un tuo nome, "id" o similare (per motivi che ora non posso certo sapere)? Allora sì, una mappa è ok.
  • Re: Java Map

    Ma al momento non ci devo fare assolutamente niente, sto solo provando.
    voglio capire se è possibile assegnare il nome dell'oggetto dinamicamente tramite un ciclo for tramite le mappe.
    non saprei come essere più chiaro di cosi..
    vediamo..
    la mia istruzione Cubo c = new Cubo(); ok?
    voglio che a quel "c" venga affiancato dinamicamente, ossia senza doverlo fare io, un numero diverso. come ho scritto nel mio esempio prima.
    vorrei fare tanti cubi, ma vorrei assegnargli parte del nome tramite, magari la variabile i del ciclo for. mi son spiegato?
  • Re: Java Map

    KuroKami69 ha scritto:


    Ma al momento non ci devo fare assolutamente niente, sto solo provando.
    voglio capire se è possibile assegnare il nome dell'oggetto dinamicamente tramite un ciclo for tramite le mappe.
    import java.util.HashMap;
    import java.util.Map;
    
    public class Prova {
        public static void main(String[] args) {
            Map<String,Cubo> mappaCubi = new HashMap<String,Cubo>();
    
            for (int i = 0; i < 10; i++) {
                mappaCubi.put("c" + i, new Cubo());
            }
        }
    }
    
    
    class Cubo {
        // ????
    }
  • Re: Java Map

    Che è esattamente quello che avevo scritto io prima e che migliorabile ha detto che non aveva senso
    quindi io con questo codice qua posso fare diversi cubi "dinamicamente" giusto? ora lo provo, grazie mille ^_^
  • Re: Java Map

    KuroKami69 ha scritto:


    Che è esattamente quello che avevo scritto io prima e che migliorabile ha detto che non aveva senso
    Perché la sintassi che avevi usato tu era fondamentalmente sbagliata e insensata.
  • Re: Java Map

    Giusto.
    se io volessi stampare, con un semplice system.out.println un valore contenuto in ognuno dei miei cubi che comando dovrei usare? sempre dentro un for
    cioè prendendo il tuo codice di prima
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Random;
    
    public class Prova 
    {
    	public static void main(String[] args)
    	{
    		Random rnd = new Random();
    		Map<String,Cubo> mappaCubi = new HashMap<String,Cubo>();
            for (int i = 0; i < 10; i++)
    		{
    			int l = rnd.nextInt(15);
    			int diag = rnd.nextInt(20);
    			mappaCubi.put("c" + i, new Cubo(l, diag));
            }
        }
    }
    
    la classe cubo
    public class Cubo
    {
    	private int l;
    	private int d;
    	
    	public Cubo()
    	{
    		l = 0;
    		d = 0;
    	}
    	
    	public Cubo(int lato, int diag)
    	{
    		l = lato;
    		d = diag;
    	}
    	
    	public void setLato(int lato)
    	{
    		l = lato;
    	}
    	
    	public void setDiagonale(int diag)
    	{
    		d = diag;
    	}
    	
    	public int getLato()
    	{
    		return l;
    	}
    	
    	public int getDiagonale()
    	{
    		return d;
    	}
    }
    
    
    la classe cubo è fatta al volo, quindi magari si poteva fare meglio.
    se io prima uso il put per creare i cubi nel for, e sempre nel for volessi stampare il valore del lato mano a mano che vengono creati?
    qualche idea la ho ma ho paura sia sbagliata
  • Re: Java Map

    KuroKami69 ha scritto:


    se io prima uso il put per creare i cubi nel for, e sempre nel for volessi stampare il valore del lato mano a mano che vengono creati?
    Se hai l'oggetto Cubo "in mano" poco prima di inserirlo con put nella mappa .... semplicemente accedi ai suoi valori (tramite i getter). E li stampi come vuoi.

    Se è in un altro punto dove hai solo la mappa, ci sono diverse strade a seconda se vuoi iterare sulle chiavi della mappa (senza saperle a priori) oppure se data una chiave (che puoi facilmente ricomporre perché è "c" seguito da numero) vuoi riottenere l'oggetto Cubo associato.
  • Re: Java Map

    Uhm non ho ben capito sinceramente
    se io sempre dentro a quel for, dopo aver creato gli oggetti cubo con il put, io volessi stampare il valore del lato di ogni cubo, come faccio? cioè, il concetto pressappoco mi è chiaro, molto meno il codice
  • Re: Java Map

    KuroKami69 ha scritto:


    Uhm non ho ben capito sinceramente
    for (int i = 0;...... ) {
        // ...
        Cubo cubo = new Cubo( .... );
    
        // Usa/stampa i dati di cubo ... quale è il dubbio?
    
        mappaCubi.put("c" + i, cubo);
    }
  • Re: Java Map

    Il mio dubbio.
    per prendere i dati da un oggetto, dovrò si usare il, in questo caso, getLato(); però se non erro il codice completo dovrebbe essere c.getLato(); giusto? quindi se io volessi richiamare e stampare il lato di ogni cubo che creo nel for, direttamente dopo la creazione nel for, com'è il codice? cioè non sarà più c.getLato(); perché, se ho ben capito, mi restituirà sempre il valore del primo cubo creato, ossia c0. quindi se non erro si deve usare il get della classe mappa no? ma non capisco come
Devi accedere o registrarti per scrivere nel forum
24 risposte