Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23
  1. #1

    Struttura dati diversa da Vector?

    Ciao a tutti,

    chiedo il vostro aiuto per una questione che mi lascia perplesso. Io per "intelaiare" dati adopero la classe Vector, che mi pare di aver capito, non permette l'inserimento delle "key" ma le imposta lui automaticamente numeriche. Allora mi servirebbe un'altra classe simile a Vector (per semplicita'), ma che mi permette l'uso delle key alfanumeriche. Ho provato HashMap, ma ho qualche difficolta' ad adoperarlo! E poi l'indice corrispondente ho visto che non e' impostato in modo crescente, ma la corrispondenza e' il numero dei caratteri contenenti nella stringa, quindi spesso trovo in prima posizione { 5=WaKKa }.

    Grazie per un eventuale aiuto!
    ~Wakka~

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Struttura dati diversa da Vector?

    Originariamente inviato da Wakka
    chiedo il vostro aiuto per una questione che mi lascia perplesso. Io per "intelaiare" dati adopero la classe Vector, che mi pare di aver capito, non permette l'inserimento delle "key" ma le imposta lui automaticamente numeriche. Allora mi servirebbe un'altra classe simile a Vector (per semplicita'), ma che mi permette l'uso delle key alfanumeriche. Ho provato HashMap, ma ho qualche difficolta' ad adoperarlo! E poi l'indice corrispondente ho visto che non e' impostato in modo crescente, ma la corrispondenza e' il numero dei caratteri contenenti nella stringa, quindi spesso trovo in prima posizione { 5=WaKKa }.
    Purtroppo per spiegare queste cose ci vorrebbe più di un post e magari pure bello lungo (dovrò prima o poi decidermi a scrivere un bel tutorial sull'argomento!). Ci sono svariati concetti da capire sulle collection.

    Innanzitutto Vector è la "vecchia" collection che è stata mantenuta a tutt'oggi per ovvi motivi di compatibilità. Ma se non ci sono necessità davvero particolari, non c'è alcun motivo di usarla. Con il "Collections Framework" introdotto a partire da Java 1.2 sono state aggiunte molte nuove collection. Tra cui ArrayList che è praticamente equivalente (anche se ci sono delle lievi differenze) al Vector salvo il fatto che Vector è synchronized mentre ArrayList non lo è.
    Anche ammesso di volere avere una lista basata su array di tipo synchronized, non ci sarebbe nemmeno bisogno di tirare in ballo Vector. Tramite la classe Collections c'è la possibilità di ottenere una "synchronized list" tramite un apposito "wrapper" (metodo synchronizedList() ).

    Una List (quindi ArrayList o Vector) è semplicemente una collezione ordinata di elementi. Se si vuole avere una collezione basata su una associazione chiave-valore, allora è ovvio che una List non va bene ma bisogna usare una implementazione concreta della interfaccia Map. E HashMap è appunto una implementazione concreta di Map.

    Usare una HashMap è abbastanza semplice, tramite i generics basta specificare i tipi di chiave e valore. Esempio:

    HashMap<String,Integer> map = new HashMap<String,Integer> ();
    map.put ("Paola", 1981);

    E grazie anche all'autoboxing si può passare un int.

    Per quanto riguarda l'ordine in una HashMap ... qui viene il bello. HashMap è una collezione definita "unsorted" / "unordered". In sostanza vuol dire che non c'è alcun ordine particolare delle chiavi. Un ordine fisico è chiaro che esisterà comunque ma dipende in primis dai valori forniti dal hashCode() degli oggetti contenuti ma anche dalla dimensione della lista dei "bucket" nella hash-table interna.
    Insomma, per dirla in altri termini, non c'è un ordine che possa essere minimamente utile, garantito e sopratutto stabile.

    Se si vuole una Map in cui sia possibile avere un qualche ordine garantito, allora bisogna andare o su LinkedHashMap o su TreeMap.

    La prima è una Map in cui internamente è affiancata una lista linkata. In tal caso è possibile avere un access-order (ordine secondo l'ultimo accesso agli elementi) o un insertion-order (ordine secondo l'inserimento). LinkedHashMap comunque è "ordered" ma non è "sorted".

    Per avere finalmente una Map "sorted" si deve usare TreeMap, che organizza gli elementi secondo un particolare tipo di albero. L'ordine si basa sul contenuto delle chiavi e la comparazione tra le chiavi per definire l'ordine può avvenire con un Comparable o con un Comparator.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    grazie della spiegazione, ora offline me la leggo con calma assoluta e vedro' i capire un po' i concetti! Beh, non voglio fare lo gnorri, ma un tutorial riassuntivo per indirizzare un utente che non ha mai avuto a che fare con questo tipo di struttura non sarebbe male, dove spieghi quale struttura utilizzare perche' piu' completa o piu' semplice da usare.

    Comunque parlando con un amico che ha fatto le industriali ho scoperto che per che vengo da un paio d'anni di PHP (autodidatta) contettualmente array=vettore e array=matrice, mentre in java sono tutte cose diverse, e cosi' ogni volta che l'uno adoperava un termine dovevamo precisare a cosa ci riferivamo.
    La differenza, in definitiva, qual e'? Tu conosci il PHP per tirare le differenze?
    Ciao e ancora grazie!
    ~Wakka~

  4. #4

    In questi casi...ho capito tutto ma non ho capito niente -.-

    Io ho necessita' che l'array sia ordinato come gli dico io, non come vuole lui! Quindi a quanto ho capito devo usare TreeMap "che organizza gli elementi in base a un certo tipo di alberto", proprio come occorre a me, sperando che non sia incasinato perso.

    HashMap<String,Integer> map = new HashMap<String,Integer> ();
    ^^^^^^^^^^ ^^^^^^^^^^
    Cosa vogliono dire? Le leggo spesso ma ancora il loro significato mi e' oscuro -.-

    Ora cerco su google una breve guida sull'uso di TreeMap.
    ~Wakka~

  5. #5
    Allora...ho provato un po' di classi che hai nominato e ho notato che:
    1) TreeMap non consente (apparentemente?) di inserire una key che sia un intero nel caso io non fornisca una key che sia un oggetto nella funzione TM.put( Obj , Obj ), sarebbe stata utile una funzione solo con un Obj, in cui la chiave sarebbe stata decisa dall'elaboratore.
    2) ArrayList consente AL.add( int , Obj ) , a non consente invece AL.add( Obj , Obj ). Praticamente sono sfigato perche' una classe o ha una "cosa" o ha un'altra -.- Spero di sbagliarmi!!
    ~Wakka~

  6. #6
    Originariamente inviato da Wakka
    1) TreeMap non consente (apparentemente?) di inserire una key che sia un intero nel caso io non fornisca una key che sia un oggetto nella funzione TM.put( Obj , Obj ), sarebbe stata utile una funzione solo con un Obj, in cui la chiave sarebbe stata decisa dall'elaboratore .
    Ma non stavi cercando "un'altra classe simile a Vector (per semplicita'), ma che mi permette l'uso delle key alfanumeriche " ?

    Al mio segnale... scatenate l'inferno!

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Wakka
    La differenza, in definitiva, qual e'? Tu conosci il PHP per tirare le differenze?
    Sì, conosco discretamente il PHP. Come dice bene il manuale ufficiale del PHP: An array in PHP is actually an ordered map.
    È una mappa a tutti gli effetti. Anche quando crei un "normale" array del tipo:

    $array = array(1, 2, 3, 4, 5);

    in realtà c'è comunque una "mappatura" tra una chiave e un valore. Dove nel caso sopra la chiave è un indice progressivo numerico.

    Ma in Java è diverso. Perché esistono innanzitutto gli array veri e propri es. int[] o Object[] che sono semplicemente degli oggetti che contengono un numero fisso di elementi indicizzati per indice. E poi si possono creare classi apposite che tramite l'uso principalmente degli array e dei reference permettono di creare "collezioni" più complesse come array espandibili (es. ArrayList/Vector) o mappe (HashMap) o code.

    Quindi in Java esistono molte più tipologie di contenitori e per una certa tipologia ci sono pure diverse varianti, vedi ad esempio ArrayList e Vector.
    In PHP non esiste una apposita collezione per fare una "coda" o uno "stack". Fai sempre tutto con quel solito array associativo.

    Originariamente inviato da Wakka
    HashMap<String,Integer> map = new HashMap<String,Integer> ();
    ^^^^^^^^^^ ^^^^^^^^^^
    Cosa vogliono dire? Le leggo spesso ma ancora il loro significato mi e' oscuro -.-
    Quelli sono i tipi parametrici. Ma qui entriamo in un argomento molto più complesso che è quello dei "generics", una nuova funzionalità introdotta in Java 5 che consente di definire delle classi "parametriche".

    Originariamente inviato da Wakka
    1) TreeMap non consente (apparentemente?) di inserire una key che sia un intero nel caso io non fornisca una key che sia un oggetto nella funzione TM.put( Obj , Obj ), sarebbe stata utile una funzione solo con un Obj, in cui la chiave sarebbe stata decisa dall'elaboratore.
    TreeMap è dichiarata (come le altre mappe) TreeMap<K,V>. Vuol dire che ha 2 tipi parametrici, una chiave e un valore.

    Originariamente inviato da Wakka
    2) ArrayList consente AL.add( int , Obj ) , a non consente invece AL.add( Obj , Obj ).
    Ma è ovvio. ArrayList è una lista di elementi basata su un indice. Non è una mappa che associa un valore ad una chiave!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Ma non stavi cercando "un'altra classe simile a Vector (per semplicita'), ma che mi permette l'uso delle key alfanumeriche " ?
    Si, ma nel caso non avessi la chiave alfanumerica sarebbe stato utile usare semplici numeri.

    Comunque ho risolto dopo una serata passata a risolvere il problema con TreeMap che l'ho trovato molto carino e comodo, simile a HashMap ma piu' bello! (forse perche' mi ha permesso di risolvere il problema )

    Grazie tante per le tue spiegazioni, sono state molto preziose, hai davvero molta pazienza, quindi complimenti!
    ~Wakka~

  9. #9
    Ok, praticamente ho completamento risolto adoperando TreeMap, e per inserire gli elemtni all'interno non ci metto nulla. Diventa difficile prenderli, perche', a differenza del PHP, non posso "prendere" una key specificando la sua posizione, se questa e' rappresentata, ad esempio, da una stringa.
    {nome=WaKKa}
    Per esempio, la key 'nome' che contiene WaKKa non posso selezionarla usando Oggetto.get( "0" ), perche' mi restituisce errore. Nel caso io non sappia che li' e' presente una key di nomne "nome", posso avere un'anteprima da inserire in un altro TreeMap delle key per poi richiamarle con un numero all'occorrenza?

    Forse non sono stato chiaro, nel caso lo rispiego!

    Grazie in anticipo, ciao e buon sabato
    ~Wakka~

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Wakka
    a differenza del PHP, non posso "prendere" una key specificando la sua posizione, se questa e' rappresentata, ad esempio, da una stringa.
    Ma nemmeno in PHP lo puoi fare.
    Cioè se in PHP fai:

    $arr = array("pippo" => "pluto");

    Non puoi fare $arr[0] per cercare di prendere il valore. Nel senso che avendo già specificato come chiave una stringa, non c'è alcuna altra chiave.

    Se invece avessi fatto:

    $arr = array("pluto");

    Allora nell'array ci sarebbe una associazione predefinita 0 => "pluto" e a quel punto $arr[0] ti ritorna il valore.

    Originariamente inviato da Wakka
    Forse non sono stato chiaro, nel caso lo rispiego!
    Sì, è meglio se rispieghi. Comunque o usi una collezione ordinata per indice o usi una collezione basata su una associazione chiave-valore. Un "mix" tra i due non esiste né in Java né in PHP.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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