|
|
|
![]() |
|
Strumenti |
![]() |
#1 | |
Member
Iscritto dal: Aug 2006
Messaggi: 244
|
[JAVA] Gestione degli array
Sto studiando gli array in java e sto provando a scrivere parecchio codice sulle possibili operazioni da fare su di essi.
Al momento sono in difficoltà su un paio di operazioni: 1 - svuotare l'array 2 - modificare la capacità dell'array(non mi interessa mantenere il suo contenuto) Mi spiego meglio: 1- ho bisogno di svuotare l'array da tutto il suo contenuto. So che mi basta fare un ciclo dove setto tutti i campi dell'array su null o comunque un valore standard. 2 - ho bisogno di cambiare la capacità dell'array ma se faccio così: Quote:
In conclusione: il problema più grosso è il passo numero 2. Accetto consigli... |
|
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
In verità non puoi cambiare la capacità di un array.
Puoi fare quello che giustamente fai nel punto due, cioè creare un nuovo array e assegnarlo ad una variabile già esistente. Deve funzionare per forza. Cioè se dici: String[] array = new String[10]; System.out.println("array size: " + array.length); array = new String[20]; System.out.println("array size: " + array.length); saltano fuori 10 e 20 senza possibilità di scampo.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Jan 2008
Città: roma
Messaggi: 296
|
non serve fare un ciclo per svuotare l'array ma basta reistanziarlo ... per il punto 2 quello che scrivi e una cosa assurda , ti mostro qui un pezzo di codice funzionante ... ( che fa la stessa cosa che hai descritto )
Codice:
String [] xd = new String [3]; xd[0] = "a"; xd[1] = "b"; xd[2] = "c"; for(String d : xd){ System.out.println(d); } // svuoto l'array e reimposto la capacità ... xd = new String [4]; for(String d : xd){ System.out.println(d); } |
![]() |
![]() |
![]() |
#4 | |||
Member
Iscritto dal: Aug 2006
Messaggi: 244
|
Quote:
Quote:
Quote:
arrayx = new String[nuovaDimensione]; Ma non accade nulla! Come se non facessi niente... L'array rimane invariato ![]() |
|||
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Punto 1: ti sei gia' risposto da solo.
Tenendo presente che in Java puoi avere array di tipi primitivi o array di riferimenti, in entrambi i casi e' comunque sufficiente valorizzare i singoli elementi assegnando loro il valore di default previsto per quel tipo, proprio come hai detto. Punto 2: dunque, cambiare la capacità dell'array significa o aumentare o diminuire il numero di elementi che esso può contenere. Bisogna tenere presente che gli array non sono "dinamici": una volta creato, un array non cambia dimensione. Bisogna creare un nuovo oggetto array specificando per esso la nuova dimensione desiderata, quindi copiare gli elementi dell'array originale in quello nuovo. Considerando il fatto di voler copiare gli elementi del vecchio array sul nuovo, in caso di un aumento di dimensioni, non ci sono particolari problemi. In caso di diminuzione invece si presenta il caso in cui il nuovo array sia di dimensione insufficiente a contenere tutti gli elementi presenti in quello originario. Detto questo, se nel codice che hai postato 'array' è dichiarato di tipo String[], francamente non vedo problemi: l'array verrà reinizializzato con la dimensione che hai specificato e che tutti gli elementi a null.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
![]() |
![]() |
![]() |
#6 |
Member
Iscritto dal: Aug 2006
Messaggi: 244
|
Ecco come ho risolto:
Se utilizzo : arrayx = new String[nuova_dimensione]; All'interno di un metodo che vado a richiamare nel main, non accade nulla. Se invece la scrivo all'interno del main funziona. Qualcuno può spiegarmi il motivo? |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
l'argomento del metodo è una variabile diversa da quella che usi quando invochi lo stesso metodo. Capita allora che se riassegni "l'argomento" è quest'ultimo che va a puntare ad un diverso valore mentre la variabile usata per l'invocazione (il cd parametro) resta dov'era.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#8 | |
Member
Iscritto dal: Aug 2006
Messaggi: 244
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
L'errore è che nello scope del tuo 'metodo' rigenera l'oggetto 'arrayx' è una copia dell'array di String che hai creato nello scope del metodo 'main'. Quindi quando nel metodo 'rigenera' esegui delle operazioni su 'arrayx', stai solo modificando una variabile locale; quando poi il metodo 'rigenera' termina, la variabile 'arrayx' locale viene distrutta. E l'array "esterno", quello dichiarato nello scope del metodo 'main', non viene neanche sfiorato. Risolvi tutto semplicemente gettando ai pesci il meotodo 'rigenera' ed effettuando un normale assegnamento: Codice:
// nel metodo main giochino = new String[nuovaDimensione];
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Non è un errore nel senso che il tuo codice è corretto. E non è un problema di array ma di puntatori.
Questo è il tuo metodo rigenera: Codice:
public void rigenera(String[] array, int nuovaDimensione) { array = new String[nuovaDimensione]; } Codice:
giochino = un certo array di stringhe dimensione_max = leggi... rigenera(giochino, dimensione_max); array = new String[nuovaDimensione] le strade di questi due puntatori si dividono. Quando scrivi tutto nel main, non c'è nulla da dividere: non ci sono due puntatori, ce n'è uno solo: Codice:
giochino = un certo array di stringhe dimensione_max = leggi... giochino = new String[dimensione_max]; Codice:
public void metodo(int argomento) { argomento = 50; } Codice:
int valore = 10; metodo(valore); System.out.println(valore); Codice:
public int metodo(int argomento) { argomento = 50; return argomento; } Codice:
int valore = 10; valore = metodo(valore); System.out.println(valore); Codice:
public String[] rigenera(String[] array, int nuovaDimensione) { return new String[nuovaDimensione]; } Codice:
int max = leggi un intero... giochini = rigenera(giochini, max); Codice:
public String rigenera(int nuovaDimensione) { return new String[nuovaDimensione]; } Codice:
int max = leggi un intero giochini = rigenera(max);
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#11 |
Member
Iscritto dal: Aug 2006
Messaggi: 244
|
Ok...
ho corretto scrivendo tutto nel main ed ho risolto.. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:10.