Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    34

    Ricerca di un nodo all'interno di un albero

    Salve !
    Sto cercando di gestire un metodo in java che, data la radice di un albero e una parola da ricercare, scorra in maniera ricorsiva tutti i suoi elementi figli. Vorrei che il metodo mi restituisse un ArrayList con tutti i nodi figli contenenti la parola ricercata.
    In parole povere dovrei partire dalla radice e scendere, verificando che ogni nodo abbia a sua volta dei figli (ma questi figli possono a loro volta avere dei sotto figli) e per ognuno di questi verificare che contengano la parola ricercata...

    Qualcuno sa darmi una dritta? Non sono pratico dei metodi ricorsivi... sono all'inizio....

    HO INIZIATO COSI'

    public ArrayList ricercaNodo(final Nodo radice, final String keyRicercata) {
    ArrayList lista = new ArrayList();
    final JAlbero.Nodo nodoRadice = radice;
    String elementoInEsame = (String) nodoRadice.getDescrizione();

    if (elementoInEsame != null) {
    if (elementoInEsame.contains(keyRicercata)) {

    listaFinale.add(elementoInEsame);
    }
    }
    .............................
    .......................................... NON SO COME FARE

    return listaFinale;
    }

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

    Re: Ricerca di un nodo all'interno di un albero

    Originariamente inviato da elly0909
    Qualcuno sa darmi una dritta?
    Per la ricorsione è molto semplice: nel metodo fai una "iterazione" sui figli del nodo e con ognuno invochi il metodo ricorsivamente passando il nodo.
    Come iterare sui figli .... dipende dalla API offerta dalla classe del Nodo ... non lo posso sapere io, non so cosa è quel tipo Nodo.

    Per la questione della lista ci sono almeno 2 soluzioni. La soluzione più pratica sarebbe quella di definire un metodo privato che riceve in input l'ArrayList. Il metodo ricercaNodo() che hai fatto continua ad esserci e con quella esatta signature ma tutta la gestione e la ricorsione la fa il metodo privato.

    Se invece non puoi/vuoi usare un metodo privato per la ricorsione, devi per forza di cose nel metodo creare l'ArrayList, quando invochi in modo ricorsivo il metodo ottieni altri ArrayList che dovrai aggiungere al tuo ArrayList che poi restituisci e così via ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    34
    Innanzitutto ti ringrazio per la risposta.

    Ho compreso cosa mi hai voluto dire...

    ho provato ad agire in questo modo:



    public ArrayList ricercaNodo(final Nodo nodo, final String keyRicercata) {

    ArrayList listaFinale = new ArrayList();
    final JAlbero.Nodo nodoInEsame = nodo;
    if (nodoInEsame.getDescrizione().contains(keyRicercat a)) {
    listaFinale.add(nodoInEsame);
    }
    // verifico se possiede figli
    Nodo[] figliAlbero = nodoInEsame.getFigli();

    if (figliAlbero != null) {
    for (int i = 0; i < figliAlbero.length; i++) {
    // ricorsione
    ArrayList listaInterna = ricercaNodo(figliAlbero[i], keyRicercata);
    if (listaInterna != null && listaInterna.size() > 0) {
    listaFinale.addAll(listaInterna);
    }
    }
    }
    return listaFinale;

    }

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da elly0909
    ho provato ad agire in questo modo:
    Tecnicamente mi sembra corretto.

    Non ho capito perché fai:

    final JAlbero.Nodo nodoInEsame = nodo;

    (vedo un tipo Nodo e un tipo JAlbero.Nodo ??)

    E poi il test:

    if (listaInterna != null && listaInterna.size() > 0) {

    è superfluo. listaInterna non è mai null e se anche fosse vuoto, il addAll() non dà alcun problema. Al massimo puoi lasciare solo il test del size().

    P.S. Metti il codice tra i tag [ CODE ] (senza spazi)!!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    34
    Ti ringrazio! Sono riuscito ad ottenere il risultato che volevo raggiunfere!

    Grazie per l'aiuto!

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 © 2025 vBulletin Solutions, Inc. All rights reserved.