Newsgroup: it.comp.java
Titolo: Dimensionamento array a runtime

Ho un array di 10 elementi. se volessi aggiungere un elemento all'array a
runtime (non in fase di compilaizone) (senza utilizzare la classe vector
ovviamente) cosa devo fare?
io ho pensato di fare cosě:
Object[] array=new Object[10];
Object[] arraytmp=new Object[10];
copiare tutti gli elementi di array in arraytmp
Object[] array=new Object[array.size()+1];
copiare tutti gli elementi di arraytmp in array
avrei cosě un nuovo array di 11 elementi. č fattibile questa cosa?

 ha scritto nel messaggio
news:pRVkb.319282$R32.10...@news2.tin.it...


 copiare tutti gli elementi di arraytmp in array
allora perché non
Object[] array=new Object[10];
Object[] arraytmp=new Object[11];
copio i primi 10 elementi di array in arraytmp
array = arraytmp;
Il problema è che in nessuno di questi due modi aggiungi niente all'array
originale. Semplicemente ne crei un altro piu' grande e ci copi l'inizio di
quello originale. Quindi nel mio esempio ti ritrovi con due array uno da 10
e l'altro da 11. Nel tuo addirittura con tre array due da 10 e uno da 11.
Lo spreco di memoria in entrambi i casi mi sembra quasi offensivo. :)
Per tornare alla tua domanda, per aggiungere un elemento all'array runtime
devi per forza usare una Collection. Ne avevamo parlato ultimamente cerca
tra i post.
Ciao
Matteo
-- 
chi sono e soprattutto chi non sono:
http://noitre.ilnomedeldominio.it
un piccolo programma per studenti universitari:
nuova versione!!!! provatelo numerosi
http://inutility.ilnomedeldominio.it/imsv/

 avrei così un nuovo array di 11 elementi. è fattibile questa cosa?
Questo è un classico esempio da manuale. Gli Object[] o + in generale i 
vettori (non Vector) vanno usati quando la loro dimensione è nota a priori 
in fase di implementazione del codice.
Negli altri casi quando hai bisogno di una struttura dinamica, la cui 
dimensione varia Runtime devi usare le liste. In java hai un sacco si 
oggetti che possono fare al caso tuo (Vector, List, ecc...). In ogni caso 
la questione non è di trovare un soluzione a livello di codice che ti 
permetta di ottenere il tuo scopo (a livello di codice si può fare tutto), 
ma di stile di programmazione.
Tra l'altro il trattamento da parte della VM di un Object[] e di un Vector 
dovrebbe essere molto diverso. Non conosco le specifiche della VM, ma so 
come la cosa funziona in C e non dovrebbere essere dissimile. Se qualcuno 
volesse chiarire la questione in questo thread sarebbe una buon argomento 
di discussione.
P.S.: perchà non puoi/vuoi usare la classe Vector?

 in fase di implementazione del codice.
beh non è proprio esatto
int a = calcolo();
Object[] array = new Object[a];
é corretto ma non so quale sarà il valore di a. Anche questa è allocazione
dinamica. 
Diciamo che gli array vanno usati quando la loro dimensione, qualunque essa
sia, non deve cambiare durante l'esecuzione.


 array = new Object[a];
come vedi la dimensione è cambiata durante l'esecuzione.

 come vedi la dimensione è cambiata durante l'esecuzione.
Mi dispiace ma non è così. Semplicemente ora "array" punta ad un NUOVO array
(ti farei notare l'operatore new, che ti dovrebbe fare venire il sospetto
che non stai cambiando la dimensione dell'array precedente...). Non è il
precedente modificato, è uno nuovo piu' grande, con conseguente spreco di
memoria. Te lo dimostra il fatto che se prima di fare questo non copi tutto
il contenuto del vecchio nel nuovo perdi tutto.


 Matteo

 dovrebbe essere molto diverso.
ma il Vector non dovrebbe proprio eseguire questa operazione in background
quando si 'allarga'? alla fine forse non cambia poi molto.
Il vantaggio dell'array poi č che e' tipizzato, anche se ciccio non sembra
necessitare di questa 'feature', ma se la volesse sarebbe davvero meglio
usare un Vector? (chiedo, non lo so :-D)
Ancora, se proprio vogliamo usare una collection, non e' meglio usare un
ArrayList invece che un Vector ?
Salute!
NicoWeb
--
Per risposte in privato parti dal Salento e togli fino a vento ;-P

 ArrayList invece che un Vector ?
Se i dati contenuti dalla struttura devono essere sincronizzati si usa 
la classe Vector, altrimenti ArrayList.
Marco
-- 
replay: remove .duh.spam

 referenziata;
Non centra assolutamente niente. Il gc non ti autorizza a sprecare memoria
perché tanto poi lui la raccoglie.
Tra ArrayList o Vector e quel metodo che dici tu per "ingrandire" un array
(creandone un altro piu' grande) c'é una grossa differenza.
Forse con un pezzeto di codice C sarò piu' chiaro.
faccio l'esempio con gli interi:
Tua realizzazione:
int *array = calloc(10,sizeof(int));
//usi  l'array
lo devi ingrandire:
int *arrtmp = calloc(11,sizeof(int));
memcpy(arrtmp,array,10*sizeof(int));//passo indispensabile anche in Java
array = arrtmp; 
/*qui un programmatore C almeno decente farebbe free(array) ma in Java non
si puo' fare. Quindi quella memoria rimane occupata finché il gc non decide
di liberarla. In questo momento ci sono due array con conseguente spreco di
memoria */
Presumibile realizzazione di Vector o ArrayList
int *array = calloc(10,sizeof(int));
//usi  l'array
lo devi ingrandire:
array = realloc(array,11*sizeof(int)); 
/* non ci sono sprechi */
Spero che ora la grossa differenza ti sia chiara. Come anche perché è piu'
efficiente usare ArrayList quando serve un array la cui dimensione cambia
durante l'esecuzione.


 Matteo
q.e.d.
ciauz.