[RISOLTO] vettori di classi

di il
10 risposte

[RISOLTO] vettori di classi

Salve a tutti.
Mi trovo ad affrontare un nuovo problema di fondo del quale c'è poca chiarezza in giro:
come si fa su Java/Android a gestire i vettori di classi?
se cioè ho una MyClass

public class MyClass 
{
 //...codice vario
}
posso stanziarne un array così

MyClass elementi[]=new MyClass[10];
questo array di classi è però limitato a 10, 100, 1000, n elementi.
Allora potrei implementare una classe che ne gestisce la dimensione variabile magari
con dei metodi del tipo Add, GetItem, DeleteItem, ecc.
Ma come si fa a cambiare la dimensione dello spazio allocato da new in fase di runtime?
in c si usa realloc oppure si fanno delle pile di dati dove ogni elemento stanziato
contiene un puntatore all'elemento che sta prima e uno all'elemeto che sta dopo.
E in Java?
ciao e grazie

10 Risposte

  • Re: [RISOLTO] vettori di classi

    Gli array sono strutture dati con dimensione statica, cioè una volta che sono stati creati non è possibile modificarla. Per cui se vuoi modificare la dimensione devi creare un nuovo array di dimensione N+1, ricopiare tutti gli N elementi e poi aggiungere il nuovo elemento. Puoi immaginare, però, l'inefficienza di questa cosa.

    Se ti serve una struttura dati con dimensione dinamica puoi usare ad esempio le liste
  • Re: [RISOLTO] vettori di classi

    Della ha scritto:


    Gli array sono strutture dati con dimensione statica, cioè una volta che sono stati creati non è possibile modificarla. Per cui se vuoi modificare la dimensione devi creare un nuovo array di dimensione N+1, ricopiare tutti gli N elementi e poi aggiungere il nuovo elemento. Puoi immaginare, però, l'inefficienza di questa cosa.

    Se ti serve una struttura dati con dimensione dinamica puoi usare ad esempio le liste
    Grazie per la tua risposta.
    Mi piacerebbe capire come funzionano le liste al loro interno così da poter implementare
    io una lista di classi. Oppure ereditare una lista e utilizzarne dei metodi...non so...come si fa?
    Sono sicuro che la possibilità c'è di implementare qualcosa di efficiente.
    In C il puntatore di un oggetto si ottiene anteponendo una &, in java mi sa che non si può
    fare e ciò è molto limitativo, ma gli sviluppatori di java hanno comunque messo a disposizione
    metodi alternativi...
    Avete consigli?
  • Re: [RISOLTO] vettori di classi

    In Java i puntatori sono gestiti in modo automatico, per cui dimentica l'operatore & (che viene usato solo per il "bitwise and") e l'operatore * (che è usato solo per le moltiplicazioni).

    Il bello di Java è che non appena lo installi ottieni "gratuitamente" una ricca libreria (ti consiglio di guardarti la documentazione e di dare uno sguardo al numero di classi che sono già implementate ), che ti offre, fra le altre cose, anche delle implementazioni di liste.

    In particolare è definita un'interfaccia List che fornisce un "contratto" che le classi che implementano una lista devono rispettare (non ho mai usato C++, ma immagino sia la stessa cosa). Se guardi più nel dettaglio puoi vedere che fra le "All known implementing Classes" c'è un elenco di classi (già implementate) che implementano tale interfaccia, di cui LinkedList, ArrayList e Vector sono le più usate. Per capire come funzionano ti basta leggerti la loro documentazione.

    Di fatto nella maggior parte dei casi non hai bisogno di implementarti manualmente una lista, ma puoi tranquillamente usare una di queste classi che, essendo definite come "generics", possono essere usate per contenere qualsiasi tipo di dato. In realtà con i generics puoi usare solo i tipi di dato non primitivi (quindi ad esempio non puoi creare una lista di int), ma questa non è una limitazione poiché esistono le classi wrapper che ti permettono di usare i tipi primitivi come se fossero delle classi. Ad esempio per creare una lista (implementata come lista concatenata) di interi scriverai:
    
    List<int> lista1= new LinkedList<int>(); // questa riga è sbagliata perché usa un tipo primitivo
    List<Integer> lista2 = new LinkedList<Integer>(); // questa usa il wrapper ed è giusta
    
  • Re: [RISOLTO] vettori di classi

    Della ha scritto:


    In Java i puntatori sono gestiti in modo automatico, per cui dimentica l'operatore & (che viene usato solo per il "bitwise and") e l'operatore * (che è usato solo per le moltiplicazioni).

    Il bello di Java è che non appena lo installi ottieni "gratuitamente" una ricca libreria (ti consiglio di guardarti la documentazione e di dare uno sguardo al numero di classi che sono già implementate ), che ti offre, fra le altre cose, anche delle implementazioni di liste.

    In particolare è definita un'interfaccia List che fornisce un "contratto" che le classi che implementano una lista devono rispettare (non ho mai usato C++, ma immagino sia la stessa cosa). Se guardi più nel dettaglio puoi vedere che fra le "All known implementing Classes" c'è un elenco di classi (già implementate) che implementano tale interfaccia, di cui LinkedList, ArrayList e Vector sono le più usate. Per capire come funzionano ti basta leggerti la loro documentazione
    Io sono nato e cresciuto con C++ e sinceramente ne sono innamorato perdutamente perchè non hai limiti di nessun genere, puoi fare quello che vuoi come vuoi quando vuoi e se lo fai bene hai soddisfazioni immense. Oggi sono obbligato a imparare Java per Android
    Però devo dire che ci sono un mare di librerie e questo è il punto di forza.
    Ora provo a studiare Vector e List. Vediamo un po'. Se risolvo condivido il risultato. ciao.
  • Re: [RISOLTO] vettori di classi

    Sicuramente C++ è molto potente, ma anche complicato. Ad esempio in Java si risolve il problema dell'ereditarietà multipla in maniera semplice: impedendola! Ogni classe può avere al più 1 superclasse (se non specificata è Object).

    Se Java ti serve solo per programmare app Android allora puoi evitare di studiarti le librerie grafiche (AWT, Swing, ..) perché android ha una libreria grafica propria. Per il resto android si basa su una versione modificata della Java Virtual Machine, per cui tutto (o gran parte di) quello che vedi di Java vale anche per android
  • Re: [RISOLTO] vettori di classi

    Della ha scritto:


    Sicuramente C++ è molto potente, ma anche complicato. Ad esempio in Java si risolve il problema dell'ereditarietà multipla in maniera semplice: impedendola! Ogni classe può avere al più 1 superclasse (se non specificata è Object).

    Se Java ti serve solo per programmare app Android allora puoi evitare di studiarti le librerie grafiche (AWT, Swing, ..) perché android ha una libreria grafica propria. Per il resto android si basa su una versione modificata della Java Virtual Machine, per cui tutto (o gran parte di) quello che vedi di Java vale anche per android
    Sono d'accordo, java innalza di molto il livello di programmazione con i suoi pro e i suoi contro.
    C è un basso livello quindi hai più accesso alle cose più vicine alla "macchina" con il difetto
    che è più laborioso dover fare alcune cose. Comunque sono gusti personali e punti di vista.

    Ho risolto grazie al tuo suggerimento studiando ed applicando la callse Vector.
    Qui un esempio:
    public class MyEventClass 
    {    
        private Vector <MyEventSurroundClass>v; 
        public int count=0;
       
        public MyEventClass()
        {
        	v= new Vector<MyEventSurroundClass>(0, 1);
        }
               
        public void AddEvent( MyEventSurroundClass listener) 
        {
            v.addElement(listener);
            count++;    	
        }      
        public void EmettiEvento(int n)
        {
        	if(n<count) v.get(n).onEvent();
        } 
        
        
    }
    ciao e grazie
  • Re: [RISOLTO] vettori di classi

    Vector e' un tipo di collezione da evitare: e' ancora presente per motivi storici, ma e' molto inefficiente. Devi usare ArrayList. Cosi' come da evitare e' Hashtable. Meglio HashMap o TreeMap
  • Re: [RISOLTO] vettori di classi

    Comunque non e' questione di gusti personali: ogni linguaggio di programmazione e' stato pensato con un contesto specifico in mente: all'interno di quel contesto, il linguaggio da il meglio di se. Al di fuori diventa complicato/inefficiente.
    Ma poiche' tutti i linguaggi di programmazione sono equivalenti alla Macchina Di Turing Universale, tutti i linguaggi di programmazione possono essere utilizzatili per fare qualunque! cosa
  • Re: [RISOLTO] vettori di classi

    Ad essere precisi, il tuo vettore non e' un vettore di classi, ma un vettore di oggetti (istanze) di classe MyClass.
    Un vettore di classi e' questo:
    
    Class[] vc = Class[10];
    
    Dove Class sta' per java.lang.Class!
  • Re: [RISOLTO] vettori di classi

    Ok grazie. Vado a studiare arraylist. ciao.
Devi accedere o registrarti per scrivere nel forum
10 risposte