Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Grazie ad un mocio rotante che viene costantemente bagnato e pulito, Narwal Flow assicura un completo e capillare lavaggio dei pavimenti di casa. La logica di intellignza artificiale integrata guida nella pulizia tra i diversi locali, sfruttando un motore di aspirazione molto potente e un sistema basculante per la spazzola molto efficace sui tappeti di casa
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi
Con un prezzo di 2.999 euro, il Panasonic Z95BEG entra nella fascia ultra-premium dei TV OLED: pannello Primary RGB Tandem, sistema di raffreddamento ThermalFlow, audio Technics integrato e funzioni gaming avanzate lo pongono come un punto di riferimento
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione
Abbiamo provato per diverse settimane il nuovo Magic V5 di HONOR, uno smartphone pieghevole che ci ha davvero stupito. Il device è il più sottile (solo 4.1mm) ma non gli manca praticamente nulla. Potenza garantita dallo Snapdragon 8 Elite, fotocamere di ottima qualità e batteria in silicio-carbonio che garantisce un'ottima autonomia. E il Prezzo? Vi diciamo tutto nella nostra recensione completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-02-2010, 14:34   #1
skyblu_angel
Member
 
L'Avatar di skyblu_angel
 
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:
array = new String[nuova_dimensione]
Non accade nulla. Nè svuota l'array, nè cambia il contenuto, nè modifica le sue dimensioni.

In conclusione: il problema più grosso è il passo numero 2.

Accetto consigli...
skyblu_angel è offline   Rispondi citando il messaggio o parte di esso
Old 19-02-2010, 15:01   #2
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
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!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 19-02-2010, 15:01   #3
vladix
Member
 
L'Avatar di vladix
 
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);
		}
vladix è offline   Rispondi citando il messaggio o parte di esso
Old 19-02-2010, 15:10   #4
skyblu_angel
Member
 
L'Avatar di skyblu_angel
 
Iscritto dal: Aug 2006
Messaggi: 244
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
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.
Ti posto il mio codice:

Quote:
// rigenera array con nuova capacità massima
System.out.print("Inserisci la nuova capacità massima dell'array : ");
appoggio=tastiera.readLine();
dimensione_max=Integer.parseInt(appoggio);
TipoArray.rigenera(giochino, dimensione_max );
Quote:
public void rigenera(String[] arrayx, int nuovaDimensione){

for (int c=0;c<arrayx.length;c++){ //svuotamento array
arrayx[c]=null;
}
arrayx = new String[nuovaDimensione];
System.out.println("Operazione avvenuta con successo.\nLa nuova massima capacità è di : "+arrayx.length+"\n");
}
Come puoi vedere, nel metodo rigenera effettuo l'operazione che mi dicevi prima te:
arrayx = new String[nuovaDimensione];
Ma non accade nulla!
Come se non facessi niente... L'array rimane invariato
skyblu_angel è offline   Rispondi citando il messaggio o parte di esso
Old 19-02-2010, 15:13   #5
banryu79
Senior Member
 
L'Avatar di banryu79
 
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)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 19-02-2010, 15:19   #6
skyblu_angel
Member
 
L'Avatar di skyblu_angel
 
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?
skyblu_angel è offline   Rispondi citando il messaggio o parte di esso
Old 19-02-2010, 15:28   #7
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
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!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 19-02-2010, 15:33   #8
skyblu_angel
Member
 
L'Avatar di skyblu_angel
 
Iscritto dal: Aug 2006
Messaggi: 244
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
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.
Dato che ho postato il codice, mi diresti quindi dove è l'errore?
skyblu_angel è offline   Rispondi citando il messaggio o parte di esso
Old 19-02-2010, 15:58   #9
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da skyblu_angel Guarda i messaggi
Dato che ho postato il codice, mi diresti quindi dove è l'errore?
Te l'ha detto proprio nelle frasi che hai quotato.
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)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 19-02-2010, 16:05   #10
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
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];
}
quando lo invochi:

Codice:
giochino = un certo array di stringhe
dimensione_max = leggi...
rigenera(giochino, dimensione_max);
rigenera si trova per le mani un puntatore allo stesso valore di giochino - solo che in rigenera quando scrivi:

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];
E' la stessa cosa che capita se diciamo:

Codice:
public void metodo(int argomento) {
    argomento = 50;
}
Codice:
int valore = 10;
metodo(valore);
System.out.println(valore);
Stampa 10, non 50. Come fai a fargli stampare 50? La via idiomatica - cioè quel che tipicamente scriviamo in Java - passa per la restituzione di un valore da parte del metodo.

Codice:
public int metodo(int argomento) {
    argomento = 50;
    return argomento;
}
Codice:
int valore = 10;
valore = metodo(valore);
System.out.println(valore);
Lo stesso vale nel caso dell'array:

Codice:
public String[] rigenera(String[] array, int nuovaDimensione) {
    return new String[nuovaDimensione];
}
Codice:
int max = leggi un intero...
giochini = rigenera(giochini, max);
Dal che si capisce che rigenera non ha poi un gran bisogno dell'argomento di tipo String[]

Codice:
public String rigenera(int nuovaDimensione) {
    return new String[nuovaDimensione];
}
Codice:
int max = leggi un intero
giochini = rigenera(max);
L'argomento di tipo String[] servirebbe se prima di riassegnare giochini dovessimo fare qualche genere di operazione sui valori originali o se il nuovo array dovesse avere dei valori che dipendono dai vecchi. Tieni conto che non è necessario impostare a null i valori di un array se questo è destinato ad essere scartato dal garbage collector.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 19-02-2010, 16:42   #11
skyblu_angel
Member
 
L'Avatar di skyblu_angel
 
Iscritto dal: Aug 2006
Messaggi: 244
Ok...

ho corretto scrivendo tutto nel main ed ho risolto..
skyblu_angel è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio Narwal Flow: con il mocio orizzontale lava i pav...
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi Panasonic 55Z95BEG cala gli assi: pannello Tande...
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione HONOR Magic V5: il pieghevole ultra sottile e co...
Recensione Google Pixel 10 Pro XL: uno zoom 100x assurdo sempre in tasca (e molto altro) Recensione Google Pixel 10 Pro XL: uno zoom 100x...
Lenovo IdeaPad Slim 3: un notebook Snapdragon X economico Lenovo IdeaPad Slim 3: un notebook Snapdragon X ...
Gli USA e la NASA non vogliono perdere l...
Il nuovo iPhone 17 Air ha già un clone A...
Una capsula SpaceX Dragon ha acceso i mo...
3 nuovissime offerte sottocosto pi&ugrav...
Robot aspirapolvere Roborock Q7 M5 a pre...
Offerte sui TV LG su Amazon: OLED evo e ...
Il Galaxy Z Fold 7 è un successo:...
Amazon abbatte i prezzi hardware: come p...
Eureka J15 Ultra imbarazza la concorrenz...
ChatGPT: il piano Free diventa più...
Il prossimo top di gamma di Vivo sarà il...
Sony mostra in anteprima la propria tecn...
Dreame A3 AWD: a IFA 2025 debutta il rob...
OpenAI, il chip proprietario per l'AI &e...
OnePlus e Hasselblad si separano: una nu...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 17:10.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v