Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [java] ancora problema sulle liste...

    ciao sono di nuovo qui con un piccolo problema:
    stavolta mi occorre restituire una lista sempre invertita

    utilizzando le classi di prima, ringrazio ancora andrea per il metodo inversione, faccio la cosa più semplice del mondo cioè creo una lista e pongo il suo header pari all'header.inversione(..,..) della classe lista, tutto dovrebbe andare invece mi ritrovo una lista vuota...
    perchè? che sbaglio?

    eccovi tutte le classi lista, nodo e la classe main usata per il test
    codice:
    public class Lista{
       private Nodo header;
       private int size;
       public Lista(){
           size=0;
       }
       public void add(Object o){
           if(size==0) header=new Nodo(o);
           else header=new Nodo(o,header);
           size++;
       }
       public void print(){
           if(size!=0) header.print();
           else System.out.println("Lista vuota");
       }
       public Lista invertiLista(){
           Lista nuova = new Lista();
           if(size!=0) nuova.header=header.inversione(null,header);
           return nuova;
       }
    }
    codice:
    public class Nodo{
       Nodo next;
       Object elemento;
       public Nodo(Object elemento, Nodo next){
           this.elemento=elemento;
           this.next=next;
       }
       public Nodo(Object elemento){
           this.elemento=elemento;
           this.next=null;
       }
       public void print(){
           System.out.println(elemento);
           if(next!=null) next.print();
       }
       public Nodo inversione(Nodo prev, Nodo n){
           Nodo next_t = n.next;
           n.next = prev;
           return next_t != null ? inversione (n, next_t) : n;
       }
    }
    codice:
    import java.io.*;
    
    public class Main{
    
       public static void main(String[] args) throws IOException{
          Lista lista = new Lista();
          BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
          
          System.out.println("Quanti elementi vuoi inserire alla lista?");
          int a = Integer.parseInt(buffer.readLine());
          
          int i=0;
          while (i < a){
             System.out.print("Inserisci un elemento in testa alla lista: ");
             lista.add( Integer.parseInt(buffer.readLine()) );
             i++;
          }
          
          System.out.println("\nStampo la lista ottenuta...");
          lista.print();
          System.out.println("\nCreo una lista inversa...");
          Lista lista2 = lista.invertiLista();
          System.out.println("\nStampo la lista ottenuta...");
          lista2.print();
        }
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [java] ancora problema sulle liste...

    Originariamente inviato da ViRUZ_gTi
    utilizzando le classi di prima, ringrazio ancora andrea per il metodo inversione, faccio la cosa più semplice del mondo cioè creo una lista e pongo il suo header pari all'header.inversione(..,..) della classe lista, tutto dovrebbe andare invece mi ritrovo una lista vuota...
    perchè? che sbaglio?
    Per un motivo molto semplice, quando fai:

    codice:
       public Lista invertiLista(){
           Lista nuova = new Lista();
           if(size!=0) nuova.header=header.inversione(null,header);
           return nuova;
       }
    È vero che crei una nuova Lista ma il fatto è che il suo size rimane a 0!!! E facendo così hai pure "sporcato" la lista originale, che rimane con 1 solo elemento, cioè il primo che aveva originalmente che però è diventato l'ultimo nella nuova lista.

    E parlando del "design", mettere quei metodi ricorsivi print() e inversione() nella classe Nodo non va bene. Lo vedi chiaramente tu che:

    nuova.header=header.inversione(null,header);

    la parte in rosso non avrebbe senso e in effetti non serve. Non ha senso invocare la inversione su un Nodo!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    dici che il metodo inversione lo devo mettere nella classe lista direttamente?
    cmq così mi funziona per quanto riguarda la modifica è solo qua che mi dà questo problema

    ho anche un esempio di copia lista dove succede qualcosa del genere e funziona bene perciò ho fatto questa scelta, ma forse và bene perchè qui istanzia un nuovo nodo...
    provo a metterlo nella classe lista vediamo che succede...

    questo è il metodo che restituisce una lista identica a quella in questione
    nella classe nodo
    codice:
       public Nodo copia(){
           Nodo nuovoNodo = new Nodo(elemento,next);
           return nuovoNodo;
       }
    nella classe lista
    codice:
       public Lista copiaLista(){
           Lista list=new Lista();
           if(size!=0) list.header=this.header.copia();
           return list;
       }

  4. #4
    ho corretto inserendo il metodo inversione direttamente nella classe lista

    dunque ho notato un altro errore anche in questo qua della copia che ho postato come esempio, infatti come mi hai detto la size rimane nulla e l'ho corretto ponendo la size della nuova lista pari a quella della lista in esame visto che era una copia

    ritornando al mio problema ho trovato questa soluzione un pò "macchinosa":

    -praticamente mi faccio prima una copia della lista e fin quà ci siamo
    -poi su quella copia effettuo l'inversione e anche questa và bene
    -unico problema quando vado a fare il ristampo della lista iniziale me la ritrovo "sporcata"

    ti mostro cosa ho fatto:

    codice:
    public class Nodo{
       Nodo next;
       Object elemento;
       public Nodo(Object elemento, Nodo next){
           this.elemento=elemento;
           this.next=next;
       }
       public Nodo(Object elemento){
           this.elemento=elemento;
           this.next=null;
       }
       public void print(){
           System.out.println(elemento);
           if(next!=null) next.print();
       }
       public Nodo copia(){
           Nodo nuovoNodo = new Nodo(elemento,next);
           return nuovoNodo;
       }
    }
    codice:
    public class Lista{
       private Nodo header;
       private int size;
       public Lista(){
           size=0;
       }
       public void add(Object o){
           if(size==0) header=new Nodo(o);
           else header=new Nodo(o,header);
           size++;
       }
       public void print(){
           if(size!=0) header.print();
           else System.out.println("Lista vuota");
       }
       //copia la lista
       public Lista copiaLista(){
           Lista list=new Lista();
           list.size=this.size;
           if(size!=0) list.header=header.copia();
           return list;
       }
       //restituisce una lista inversa
       public Lista invertita(){
           Lista nuova = copiaLista();
           if(size!=0)nuova.header = inversione(null,nuova.header);
           return nuova;
       }
       //inverte una lista
       public Nodo inversione(Nodo prev, Nodo n){
           Nodo next_t = n.next;
           n.next = prev;
           //? : operatore condizionale, ternario
           //La forma dell'operatore ternario è: 
           //condizione ? seVero : seFalso 
           return next_t != null ? inversione (n, next_t) : n;
       }
    }
    codice:
    import java.io.*;
    
    public class Main{
    
       public static void main(String[] args) throws IOException{
          Lista lista = new Lista();
          BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
          
          System.out.println("Quanti elementi vuoi inserire alla lista?");
          int a = Integer.parseInt(buffer.readLine());
          
          int i=0;
          while (i < a){
             System.out.print("Inserisci un elemento in testa alla lista: ");
             lista.add( Integer.parseInt(buffer.readLine()) );
             i++;
          }
          
          System.out.println("\nStampo la lista ottenuta...");
          lista.print();
          System.out.println("\nCreo una lista inversa...");
          Lista lista2 = lista.invertita();
          System.out.println("\nStampo la lista ottenuta...");
          lista2.print();
          System.out.println("\nRistampo la lista iniziale...");
          lista.print();
        }
    }

    ecco il test che ho fatto:

    Quanti elementi vuoi inserire alla lista?
    4
    Inserisci un elemento in testa alla lista: 2
    Inserisci un elemento in testa alla lista: 6
    Inserisci un elemento in testa alla lista: 4
    Inserisci un elemento in testa alla lista: 1

    Stampo la lista ottenuta...
    1
    4
    6
    2

    Creo una lista inversa...

    Stampo la lista ottenuta...
    2
    6
    4
    1

    Ristampo la lista iniziale...
    1
    4
    1

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da ViRUZ_gTi
    codice:
       public Lista copiaLista(){
           Lista list=new Lista();
           list.size=this.size;
           if(size!=0) list.header=header.copia();
           return list;
       }
    Così non stai veramente facendo una "copia profonda" della lista. Stai solo clonando il primo elemento ma il resto è linkato sulla lista originale. Il primo nodo è duplicato ma poi entrambe le liste proseguono con gli stessi identici elementi (immagina 2 strade che si uniscono e continuano in una sola).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    ho capito
    beh provo a vedere meglio sto facendo un pò di confusione
    cmq grazie ancora gentilissimo per i consigli ti farò sapere se ci sono riuscito

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.