RISOLTO Non riesco a risolvere questi 3 metodi sulle liste in java

Stato
Discussione chiusa ad ulteriori risposte.

Cristian02

Nuovo Utente
25
2
Salve, mi sto esercitando sulle liste in java, ho fatto vari screenshot sulla classe "Test","Nodo" e "Lista per farvi vedere come ho ragionato.
invece, nella classe "Lista" dovevo mettere un attributo di tipo Nodo Head
il problema sta nella classe "Lista", 3 metodi ho chiamati:
1°: metodo "concatenazione" che devo concatenare la lista L2 passata dal parametro alla fine della lista corrente.
2°: metodo "modificare" deve modificare tutti gli elementi pari e duplicando tutti dispari, però deve mantenere lo stesso ordine. Faccio un esempio:
L=6-->1-->3-->4-->5
allora il risultato di L è=1-->1-->3-->3-->5-->5
3°: il metodo "ricerca" deve restituire la lista delle posizioni in cui è presente nella lista L. faccio un esempio:
L=1-->15-->1-->9-->8-->1 l'utente vuole ricercare <1>
mi deve dare: L=1-->3-->6
Java:
    public void modificare(Nodo L) {
        L=head;
        int disparo=0;
        while(L.getLink()!=null) {
            if(L.getElemento()/2==1) {
                L.setElemento(disparo);
                L.getLink().getLink();    //riferisce al prossimo nodo
                L.setElemento(disparo);
            }
            L=L.getLink();        //Scorimento
        }
    }
Java:
    public int ricerca(int ricerca) {
        Nodo p=head;
        int i=0;
        while(p.getLink()!=null) {        //Scorri la lista
            if(p.getElemento()==ricerca) {
                System.out.print(i++);
            }
            p=p.getLink();    //scorimento
            i++;
        }
        return i++;
    }
Java:
    public void concatenazione(Lista L,Lista L2) {
        Nodo p=head;
        while(p.getLink()!=null) {
            p=p.setLink(p);
            p=p.getLink();
        }
    }
Scrivo tutte tre classe:
Classe Nodo:

Java:
package pag_8;

public class Nodo {
    private int elemento;
    private Nodo link;
    
    public Nodo(int elemento,Nodo link) {
        this.elemento=elemento;
        this.link=link;
    }
    public Nodo() {
        elemento=0;
        link=null;
    }
    public void setElemento(int elemento) {
        this.elemento=elemento;
    }
    public void setLink(Nodo link) {
        this.link=link;
    }
    public int getElemento() {
        return elemento;
    }
    public Nodo getLink() {
        return link;
    }
    
}

Classe Lista:

Java:
package pag_8;
public class Lista {
    private Nodo head;
    
    public Lista(Nodo head) {
        this.head=head;
    }
    public void setHead(Nodo head) {
        this.head=head;
    }
    public Nodo getHead() {
        return head;
    }
    public void inserimentoInTesta(Nodo L) {
        L.setLink(head);    // <L> si riferiscie a <head>
        head=L;        //Cosi <L> diventa il primo nuovo nodo
    }
    public void inserimentoInCoda(Nodo L) {
        Nodo p=head;        //riferisco per scorrere la lista
        while (p.getLink()!=null){    //Scorri la lista
            p=p.getLink();        //Scorimento
        }
        p.setLink(L);        //<L> diventa il nuovo ultimo nodo
    }
    public void stampaLista() {
        if(head!=null) {
            Nodo p=head;
            System.out.print(p.getElemento()+"-->");
            while(p.getLink()!=null) {               
                p=p.getLink();
                System.out.print(p.getElemento()+"-->");
            }       
            System.out.println("null");
        }       
        
    }
    public int  restituireMinimo() {
        int min;
        Nodo p=head;
        min=p.getElemento();
        while(p.getLink()!=null) {
            if(p.getElemento()<min) {
                min=p.getElemento();
            }
            p=p.getLink();    //Scorimento
        }
        return min;
    }
    public void modificare(Nodo L) {
        L=head;
        int disparo=0;
        while(L.getLink()!=null) {
            if(L.getElemento()/2==1) {
                L.setElemento(disparo);
                L.getLink().getLink();    //riferisce al prossimo nodo
                L.setElemento(disparo);
            }
            L=L.getLink();        //Scorimento
        }
    }

    public int ricerca(int ricerca) {
        Nodo p=head;
        int i=0;
        while(p.getLink()!=null) {        //Scorri la lista
            if(p.getElemento()==ricerca) {
                System.out.print(i++);
            }
            p=p.getLink();    //scorimento
            i++;
        }
        return i++;
    }
    public void concatenazione(Lista L,Lista L2) {    //Ho ricominciato tante volte che alla fine non mi vengono in menete come risolvere
        Nodo p=head;
        while(p.getLink()!=null) {
            p=p.setLink(p);
            p=p.getLink();
        }
    }
}

Classe Test:

Java:
package pag_8;
import java.util.Scanner;
public class Test {
    
    public static void main(String [] args) {
        Scanner in= new Scanner (System.in);
        int ricerca;
        Nodo n1= new Nodo(1,null);
        Nodo n2= new Nodo(10,null);
        Lista L=new Lista (n1);
        Lista L2=new Lista (n2);
        System.out.println("1° Lista");
        L.inserimentoInTesta(new Nodo(6,null));
        L.inserimentoInCoda(new Nodo(3,null));
        L.inserimentoInCoda(new Nodo(4,null));
        L.inserimentoInCoda(new Nodo(5,null));
        L.stampaLista();
        System.out.println("2° Lista");
        L2.inserimentoInCoda(new Nodo(23,null));
        L2.inserimentoInCoda(new Nodo(10,null));
        L2.inserimentoInCoda(new Nodo(15,null));
        L2.stampaLista();
        System.out.println(L.restituireMinimo());
        L.concatenazione(L,L2);    //Problema
        L.modificare(new Nodo(9,null));    //Problema
        L.stampaLista();
        
        System.out.println("Inserisci un numero di tipo intero da ricercare nella lista");
        ricerca=in.nextInt();
        L.ricerca(ricerca);        //Problema
        L.stampaLista();
    }
}

Spero che sono stato più chiaro possibile evitando qualsiasi malintesi.
Grazie per la vostra attenzione :D
 

Allegati

  • Main.png
    Main.png
    57.7 KB · Visualizzazioni: 23
  • Nodo.png
    Nodo.png
    26.4 KB · Visualizzazioni: 26
  • Lista 1.png
    Lista 1.png
    44 KB · Visualizzazioni: 20
  • Lista 2.png
    Lista 2.png
    32.7 KB · Visualizzazioni: 22
  • Lista 3.png
    Lista 3.png
    7.2 KB · Visualizzazioni: 25
Ultima modifica:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Le immagini non vanno bene, è meglio se riporti il codice, è molto più fruibile (specie da smartphone), sempre usando il tag CODE. Non preoccuparti per la lunghezza, tanto è fisso, o altre a un tot di pagina non occupa (al limite c'è sempre il tag SPOILER). ?

Non ho ben capito quale sia il problema però, non lo dici in realtà.
Un errore che vedo è che chiami il metodo setter getLink() in concatenazione() assegnando alla variabile p il ritorno, che non c'è, essendo void.

Alcuni consigli o cose che sistemerei:
  • innanzitutto "disparo" non esiste; i numeri sono "dispari", vale sia per il singolare che per il plurale.
  • il metodo modificare() non si capisce cosa faccia: dagli un nome più consono.
  • "link" per connettere il prossimo elemento non significa molto, sembra un attributo del nodo (il suo valore), cerca un nome più opportuno (prossimoElemento, potrebbe già andare meglio);
  • il maiuscolo per convenzione indica una costante, non va usato per le variabili; inoltre Node L, come sopra non ha molto significato.

Attendo di capire meglio quale sia il problema, e il codice sotto tag CODE (sono un pò arrugginito con Java, non lo uso seriamente da 8-9 anni almeno, quindi mi trovo più comodo se eseguo il codice). ?
 

Andretti60

Utente Èlite
6,440
5,091
Innanzi tutto, quel è il tuo livello di conoscenza di programmazione? Sei autodidatta, fai un tecnico o l’università?

Il tuo codice è una bella Lista di errori (tanto per restare in tema) incluso uno che è fondamentale, ossia che la tua classe Lista espone ai clienti la definizione della classe Nodo, che deve restare interna. I clienti della classe Lista devono passare alla classe solo gli oggetti che sono interessati a mettere in lista, è poi responsabilità della classe Lista di gestire i dettagli (in questo caso la concatenazione degli elementi). Questo è uno dei fondamenti della programmazione (non solo OOP, non solo in Java)

PS in Java esistono già svariate classi che gestiscono liste, immagino tu stia facendo questo solo come esercizio.
PPS questi in realtà sono tre problemi diversi, avresti dovuto scrivere una discussione per ciascuno.
 

Cristian02

Nuovo Utente
25
2
Innanzi tutto, quel è il tuo livello di conoscenza di programmazione? Sei autodidatta, fai un tecnico o l’università?

Il tuo codice è una bella Lista di errori (tanto per restare in tema) incluso uno che è fondamentale, ossia che la tua classe Lista espone ai clienti la definizione della classe Nodo, che deve restare interna. I clienti della classe Lista devono passare alla classe solo gli oggetti che sono interessati a mettere in lista, è poi responsabilità della classe Lista di gestire i dettagli (in questo caso la concatenazione degli elementi). Questo è uno dei fondamenti della programmazione (non solo OOP, non solo in Java)

PS in Java esistono già svariate classi che gestiscono liste, immagino tu stia facendo questo solo come esercizio.
PPS questi in realtà sono tre problemi diversi, avresti dovuto scrivere una discussione per ciascuno.
Faccio il tecnico Industriale sono al 4 devo fare il quinto e ho avuto il debito di informatica.
Scusami tanto, ma non ho capito proprio bene che cosa intendi dire?
Caso mai mando un esercizio che mi ha dato la professoressa. Grazie per la sua attenzione
 

Allegati

  • pag 8.jpeg
    pag 8.jpeg
    285.3 KB · Visualizzazioni: 32

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Scusami tanto, ma non ho capito proprio bene che cosa intendi dire?

Se ho inteso correttamente, che in quel modo sei costretto a far usare Nodo al di fuori dalla classe Lista; il Nodo dovrebbe essere qualcosa di interno, il codice che usa la Lista non deve saper utilizzare il Nodo.

In pratica il Nodo dovresti crearlo nella classe Lista.

Appena posso leggo anche quanto hai allegato.

EDIT:
@Cristian02

Ti consiglio di aggiungere qualche messaggio nella stampa dei risultati (tipo quando stampi il valore minimo).

Iniziamo dalla concatenazione. Ciò che devi fare è ricevere come parametro la lista 2 (L2), e concatenarla alla lista corrente. Quindi non ti serve il parametro L1, sei già nel contesto di quella lista.

Hai diverse strade. Scomponi il problema in problemi più piccoli. Qual è la prima cosa che devi fare?
Un ciclo sulla seconda lista e richiamare semplicemente sulla lista corrente il metodo inserisciInCoda,

Non è molto efficiente (ma è semplice da scrivere), in quanto per ogni nuovo nodo vai a scorrere tutta la lista; avrebbe senso scorrerla tutta solo la prima volta, e poi mantenere un riferimento all'ultimo elemento.
 
Ultima modifica:

Ibernato

Utente Èlite
4,328
2,047
OS
Windows 10 Pro / Ubuntu 22.04
Posta su github il tuo codice per rendere più chiara la situazione.
Così è improponibile
 
  • Mi piace
Reazioni: Cristian02

Cristian02

Nuovo Utente
25
2
Se ho inteso correttamente, che in quel modo sei costretto a far usare Nodo al di fuori dalla classe Lista; il Nodo dovrebbe essere qualcosa di interno, il codice che usa la Lista non deve saper utilizzare il Nodo.

In pratica il Nodo dovresti crearlo nella classe Lista.

Appena posso leggo anche quanto hai allegato.

EDIT:
@Cristian02

Ti consiglio di aggiungere qualche messaggio nella stampa dei risultati (tipo quando stampi il valore minimo).

Iniziamo dalla concatenazione. Ciò che devi fare è ricevere come parametro la lista 2 (L2), e concatenarla alla lista corrente. Quindi non ti serve il parametro L1, sei già nel contesto di quella lista.

Hai diverse strade. Scomponi il problema in problemi più piccoli. Qual è la prima cosa che devi fare?
Un ciclo sulla seconda lista e richiamare semplicemente sulla lista corrente il metodo inserisciInCoda,

Non è molto efficiente (ma è semplice da scrivere), in quanto per ogni nuovo nodo vai a scorrere tutta la lista; avrebbe senso scorrerla tutta solo la prima volta, e poi mantenere un riferimento all'ultimo elemento.
Ho risolto il problema! Grazie mille :D! Lo so che per lei avrebbe risolto in meno di 5 minuti questo esercizio rispetto a me che ci ho passato 2 giorni per capire perchè il mio codice non funzionava ?
Comunque la ringrazio ancora per avermi seguito e per avermi consigliato, l'apprezzo molto
 
  • Mi piace
Reazioni: DispatchCode

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Ciao, sono contento tu abbia risolto. Vuoi condividere tutto il codice? Giusto per vedere come hai completato l'opera, e magari ci viene in mente qualche suggerimento da darti, per il futuro ?


PS. dai pure del "tu" a tutti qui sul forum, non farti problemi.
 
  • Mi piace
Reazioni: Cristian02
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili