Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Mate X7 rinnova la sfida nel segmento dei pieghevoli premium puntando su un design ancora più sottile e resistente, unito al ritorno dei processori proprietari della serie Kirin. L'assenza dei servizi Google e del 5G pesa ancora sull'esperienza utente, ma il comparto fotografico e la qualità costruttiva cercano di compensare queste mancanze strutturali con soluzioni ingegneristiche di altissimo livello
Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
La facilità di installazione e la completa automazione di tutte le fasi di utilizzo, rendono questo prodotto l'ideale per molti clienti. Ecco com'è andata la nostra prova in anteprima
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 13-06-2011, 22:38   #1
x3d0
Member
 
Iscritto dal: Jun 2008
Messaggi: 159
[JAVA] Chiarimento su strutture lineari

Ciao a tutti,
questo è un metodo di una struttura lineare
Codice PHP:
public void rimuoviUtente(String n) {
        
Utente p inizio;
        if (
== null)
            return;
        if (
p.nome.equals(n)) {
            
inizio inizio.prox;
            return;
        }
        while ((
p.prox != null) && (!p.prox.nome.equals(n)))
            
p.prox;
        if (
p.prox != null
            
p.prox p.prox.prox;
        
//QUI!


    

Codice PHP:
public class Utente {
    
String nome;
    
String email;
    
Utente prox;
  
    public 
Utente(String nString e) {
        
nome n;
        
email e;
        
prox null;
    }

Il metodo rimuove correttamente un utente dalla lista. Quello che non capisco è: La nuova lista "p", creata all'interno del metodo, è accessibile solo all'interno del metodo. Perchè non viene copiata dentro this.inizio che è pubblico?

O meglio, siccome il metodo rimuoviUtente viene chiamato dall'esterno e dall'esterno viene letto solamente this.inizio perchè "p" non viene copiato in this.inizio?

La classe e il collaudo funziona correttamente. Ma non capisco come diavolo faccia se non gli aggiungo
Codice PHP:
this.inizio p
Se lo aggiungo dopo viene cancellato il primo nodo della lista e anche l'ultimo. E non capisco il perchè...
x3d0 è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2011, 13:42   #2
Gin&&Tonic
Member
 
L'Avatar di Gin&&Tonic
 
Iscritto dal: Aug 2010
Messaggi: 138
A

Ultima modifica di Gin&&Tonic : 14-06-2011 alle 13:44.
Gin&&Tonic è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2011, 13:43   #3
Gin&&Tonic
Member
 
L'Avatar di Gin&&Tonic
 
Iscritto dal: Aug 2010
Messaggi: 138
Codice:
while ((p.prox != null) && (!p.prox.nome.equals(n))) 
            p = p.prox; 
        if (p.prox != null) 
            p.prox = p.prox.prox; 
        //QUI! ??
devi togliere completamente l'if interno al while , non serve a nulla. La tua "lista utenti" viene già esaminata nodo per nodo dall'istruzione:

while (p.prox != null) 
     p = p.prox; 

    }



In altre parole il metodo è questo:

Codice:
public void rimuoviUtente(String n) { 
        Utente p = inizio; 
        if (p == null) 
            return; 
      
        while (p.prox != null) {
            p = p.prox; 
            if (p.nome.equals(n)) { 
            inizio = inizio.prox; 
            return; 
      }
   } 
}


Non ho capito bene cosa fà questo : Utente p = inizio;

Ultima modifica di Gin&&Tonic : 14-06-2011 alle 13:45.
Gin&&Tonic è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2011, 22:07   #4
x3d0
Member
 
Iscritto dal: Jun 2008
Messaggi: 159
Si, ma non capisco perchè non viene aggiornata la variabile this.inizio, ma solo la variabile locale

Questo ad esempio è un altro pezzo di codice.
Io ragiono così:
- Inizializzo "p" al valore this.inizio. (Prodott inizio è il primo nodo della lista)
perchè non posso scorrere direttamente su this.inizio altrimenti viene cambiato il valore e rimangono con solamente l'ultimo nodo in mano.
- Se è nullo, ovvero se sto al primo nodo, allora aggiungo un nuovo nodo al primo (this.inizio)
(Fin qui ha senso..)
- Poi ciclo i successivi nodi della lista "p"
- Quando si verifica una certa condizione, aggiorno l'attributo "quantità" di "p".

Questo codice funziona (e' un esercizio d'esempio).
Quello che non capisco è come faccia a funzionare se la variabile "p" è una variabile locale!!
Avrebbe più senso se la modifica della quantità fosse stata fatta a this.inizio (come per il primo nodo).

Illuminatemi. Non riesco a venirne a capo! Please

Codice PHP:
public void aggiornaMagazzino(String cString dint q) {
        
Prodotto p this.inizio;
        if (
== null)
            
this.inizio = new Prodotto(cdq);
        else {
            while (
p.prox != null)
                
p.prox;
            if (
condizione
                
p.quant += q;
            
        }
    } 
x3d0 è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2011, 22:19   #5
X3n0
Senior Member
 
Iscritto dal: Dec 2010
Città: Milano
Messaggi: 1422
non è che potresti postare i codici completi di tutte le classi? così non si riesce a ragionare
X3n0 è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2011, 22:22   #6
x3d0
Member
 
Iscritto dal: Jun 2008
Messaggi: 159
Si, certo. Ecco qui...


Codice PHP:
public class Magazzino
{
    
Prodotto inizio;

    public 
void aggiornaMagazzino(String cString dint q) {
        
Prodotto p inizio;
        if (
== null)
            
inizio = new Prodotto(cdq);
        else {
            while (
p.prox != null)
                
p.prox;
            if (
condizione
                
p.quant += q;
        }
    }


Codice PHP:
public class Prodotto {
    
String codice;
    
String desc;
    
int quant;
    
Prodotto prox;
   
    public 
Prodotto(String cString dint q) {
        
codice c;
        
desc d;
        
quant q;
        
prox null;
    }

x3d0 è offline   Rispondi citando il messaggio o parte di esso
Old 15-06-2011, 08:56   #7
X3n0
Senior Member
 
Iscritto dal: Dec 2010
Città: Milano
Messaggi: 1422
allora il punto è che fai casino con i campi della classe prodotto.
nel paradigma ad oggetti è sempre sconsigliabile lasciare accessibili dall'esterno campi di una classe, e quindi è anche sconsigliabile andarvi ad accedere.

il mio consiglio è di rendere disponibili dei metodi nella classe prodotto che ne accedano ai campi.

ad esempio quando vuoi settare il prossimo prodotto, invece di fare p=p.prox avrai un metodo
Codice:
public boolean setProx(Prodotto p){
     if(this.prox!=null){
          this.prox=p;
          return true;
     }
     else
          return false;
}
e poi richiami in "magazino" inizio.setProx(p);


ma perchè non usare una List?
X3n0 è offline   Rispondi citando il messaggio o parte di esso
Old 15-06-2011, 21:11   #8
x3d0
Member
 
Iscritto dal: Jun 2008
Messaggi: 159
Non posso usare List perchè è un esercizio d'esame. La difficoltà è farlo senza List e framework vari.

A parte il fatto di incapsulare this.inizio. Quello è chiaro ma non è un problema ora.

Provo a spiegarmi meglio. Questo codice funziona perfettamente.
Il problema è che non capisco come faccia a funzionare.
se "p" non è nullo viene modificato un valore di un nodo della lista.
Fin qui tutto ok.
Il fatto è che la variabile "p" è locale, quindi dovrebbe morire alla fine del metodo e, subito dopo la modifica della lista, non c'è alcun legame con this.inizio!
Quando vado a stampare l'intera lista (da un altro metodo), ovvero "inizio" non vado a leggere "p"! Ma la lista risulta modificata! Cosa fà??

Codice PHP:
public class Magazzino 

    
Prodotto inizio

    public 
void aggiornaMagazzino(String cString dint q)
 { 
        
Prodotto p inizio
        if (
== null
            
inizio = new Prodotto(cdq); 
        else { 
            while (
p.prox != null
                
p.prox
            if (
condizione
                
p.quant += q
        } 
    } 

x3d0 è offline   Rispondi citando il messaggio o parte di esso
Old 15-06-2011, 21:21   #9
X3n0
Senior Member
 
Iscritto dal: Dec 2010
Città: Milano
Messaggi: 1422
tu modifichi però inizio e il campo quantità della classe prodotto, è ovvio che la tua struttura dati ne sarà modificata!

o forse non ho capito bene cosa vuoi dire...
X3n0 è offline   Rispondi citando il messaggio o parte di esso
Old 16-06-2011, 09:33   #10
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da x3d0 Guarda i messaggi
...
Il fatto è che la variabile "p" è locale, quindi dovrebbe morire alla fine del metodo e, subito dopo la modifica della lista, non c'è alcun legame con this.inizio!
...
Quando vado a stampare l'intera lista (da un altro metodo), ovvero "inizio" non vado a leggere "p"! Ma la lista risulta modificata! Cosa fà??
...
Ciao x3d0,
credo che tu non abbia ben chiara la distinzione, in Java, tra un'istanza e il riferimento ad un'istanza.

Questa è la dichiarazione di un riferimento ad una istanza di tipo Prodotto con inizializzazione al valore di default:
Codice:
Prodotto p;
// equivale a: 
// Prodotto p = null;
Anche questa è la dichiarazione di un riferimento ad una istanza di tipo Prodotto (con inizializzazione al valore di default):
Codice:
Prodotto inizio;
// equivale a:
// Prodotto inizio = null;
"p" e "inizio", nei codici qui sopra, sono dei riferimenti inizializzati a null, cioè non si riferiscono (oppure non puntano, non sono collegati, come preferisci) a nessuna istanza di Prodotto.
Se provi ad accedere ad un membro di istanza di Prodotto (ad esempio al membro "codice" così: "p.codice;") tramite uno di questi due riferimenti viene lanciata una NullPointerException.

Come abbiamo detto, "p" e "inizio" sono dei riferimenti. Ma quando entrano in gioco le istanze vere e proprie?
Quando vengono create con la keyword "new".
Qui, ad esempio:
Codice:
Prodotto p = new Prodotto(c, d, q);
Cosa succede? A sinistra dell'operatore di assegnamento viene dichiarato "p" come un riferimento di tipo Prodotto; a destra dell'operatore di assegnamento viene creata un'istanza di Prodotto.
Il risultato ora è che "p" si riferisce a quell'istanza di Prodotto.
Nota come nel codice un'istanza di per se non ha un nome, è anonima; a venire nominati sono solo i riferimenti alle istanze (in Java).

Un ultimo esempio.
Nel codice che segue immagina che la chiamata a stampa() abbia l'effetto di stampare il nome di ogni riferimento a Prodotto esistente seguito dal valore dei membri dell'istanza di Prodotto a cui è collegato.
Codice:
Prodotto inizio, p;

// 1)
inizio = new Prodotto("123", "istanza1", 1);
p = inizio;
stampa();
// inizio = ["123", "istanza1", 1]
// p = ["123", "istanza1", 1]

// 2
inizio = null;
stampa();
// inizio = null
// p = ["123", "istanza1", 1]

// 3
inizio =  new Prodotto("456", "istanza2", 1);
stampa();
// inizio = ["456", "istanza2", 1]
// p = ["123", "istanza1", 1]

// 4
Prodotto tmp = inizio:
inizio = p;
p = tmp;
tmp = null;
stampa();
// inizio = ["123", "istanza1", 1]
// p = ["456", "istanza2", 1]
// tmp = null

// 5
Prodotto a, b;
a = new Prodotto("789, "istanza3", 1);
b = a;
a.codice = "999";
b.desc = "istanzaX";
stampa();
// inizio = ["123", "istanza1", 1]
// p = ["456", "istanza2", 1]
// tmp = null
// a = ["999", "istanzaX", 1]
// b = ["999", "istanzaX", 1]
La morale è che l'operatore di assegnamento (=) applicato ad un riferimento collega quel riferimento con un'istanza, o indicando l'istanza a cui collegarsi direttamente (il caso del new) o indicandola indirettamente tramite un'altro riferimento.
Cioè l'assegnamento è un'operazione che modifica il riferimento (lo fa puntare ad un'altra istanza) e non tocca le istanze.

Invece l'assegnamento applicato a un membro di istanza attraverso un riferimento a quella istanza (il caso di a.codice = ... oppure b.desc = ..., con a e b che puntano alla stessa istanza) è una mutazione che si applica all'istanza stessa e non tocca i riferimenti (cioè non sono "a" e "b" a venire modificati, ma l'istanza a cui entrambi si riferiscono).


Ora prova ad analizzare nuovamente la classe Magazzino e il suo metodo aggiornaMagazzino: dovresti essere in grado di spiegarci cosa fa, e quindi perchè "funziona"
__________________

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)

Ultima modifica di banryu79 : 16-06-2011 alle 14:47.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
I produttori non faranno sconti sulle me...
Ubisoft potrebbe cedere pezzi se il pian...
Qualcomm potrebbe utilizzare una tecnolo...
Starfield per Nintendo Switch 2 potrebbe...
Un MacBook Pro a -300€, i MacBook Air M4...
Amazon abbassa i prezzi sugli iPhone: sc...
Amazon, ancora sconti sugli smartphone A...
iPhone Air 2 'riciclerà' alcuni c...
Offerta Amazon da non perdere: lo speake...
Nioh 3 debutta alla grande su Steam: pri...
Al centro della Via Lattea ci potrebbe e...
Elon Musk ora guarda alla Luna: SpaceX p...
La Cina ha lanciato nuovamente lo spazio...
Blue Origin potrebbe realizzare il lande...
Artemis II: il prossimo Wet Dress Rehear...
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: 13:31.


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