Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: Iterator e hasmap

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2018
    Messaggi
    46

    Iterator e hasmap

    Ciao.
    Volevo chiedervi come poter implementare l'interfaccia Iterable per poter scorrere un hashmap<MioTipo, LinkedList<MioTipo>>.
    Però quello che vorrei fare è poter scorrere non solo le coppie (chiave, lista) ma anche le singole liste associate ad ogni chiave. Immagino quindi che devo dichiarare un Itarator sia su un tipo Hashmap e uno per i tipi LinkedList, o sbaglio? Non ho ben capito cosa inserire nella classe di implementazione.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Giuso Visualizza il messaggio
    Volevo chiedervi come poter implementare l'interfaccia Iterable per poter scorrere un hashmap<MioTipo, LinkedList<MioTipo>>.
    Innanzitutto non ho capito perché parli di "implementare Iterable". Se usi collezioni del framework, non devi implementare alcun Iterable. HashMap non è lui stesso Iterable. Puoi invece iterare sulle chiavi, sulle entry o sui valori.

    Quote Originariamente inviata da Giuso Visualizza il messaggio
    Però quello che vorrei fare è poter scorrere non solo le coppie (chiave, lista) ma anche le singole liste associate ad ogni chiave. Immagino quindi che devo dichiarare un Itarator sia su un tipo Hashmap e uno per i tipi LinkedList, o sbaglio? Non ho ben capito cosa inserire nella classe di implementazione.
    Se vuoi iterare sulle entry:

    codice:
    HashMap<MioTipo, LinkedList<MioTipo>> mappa = //.......................
    
    for (Map.Entry<MioTipo, LinkedList<MioTipo>> entry : mappa.entrySet()) {
        MioTipo chiave = entry.getKey();
        LinkedList<MioTipo> valore = entry.getValue();
    
        // ..... usa chiave/valore
    }

    Poi essendo il valore un LinkedList, ovviamente puoi iterare anche su quello, per ciascuna entry.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2018
    Messaggi
    46
    Cioè se ho capito bene mi stai dicendo che potrei benissimo usare dei for each? Infatti per adesso ho fatto tutto con for e for each

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Giuso Visualizza il messaggio
    Cioè se ho capito bene mi stai dicendo che potrei benissimo usare dei for each?
    Certo, di base si può benissimo usare il "for-each" di Java 5. Il Set delle chiavi, il Set delle entry e il Collection dei valori sono tutte cose "iterabili".
    Poi a seconda di cosa devi fare (e se usi Java 8+) puoi anche sfruttare la Stream API o altri metodi di Map specifici.
    Ultima modifica di andbin; 03-04-2018 a 15:04
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2018
    Messaggi
    46
    Infatti anche a me sembrava andasse già bene così, però era richiesto l'uso di Iterator e Iterable, ho anche il metodo @Override nella classe di implementazione dell'esercizio e non capivo come implementarlo, ma per come ho fatto l'esercizio penso non serva a questo punto. Grazie

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Giuso Visualizza il messaggio
    però era richiesto l'uso di Iterator e Iterable, ho anche il metodo @Override nella classe di implementazione dell'esercizio e non capivo come implementarlo
    Mettiamola così, in modo che ti sia più chiaro. Se devi semplicemente usare delle collezioni del framework, non devi implementare Iterator/Iterable. Le collezioni sono già "iterabili". Le usi e le iteri come ti pare.
    Discorso diverso invece se dovessi realizzare una nuova collezione "da zero" (tipicamente/sovente per motivi "didattici") oppure se fai una classe che rappresenta una composizione di N elementi (magari sfruttando al suo interno collezioni del framewok) e vuoi iterare su un oggetto della tua classe.

    Ti faccio un esempio banale ma comprensibile: hai una classe Prodotto (un prodotto vendibile) e una classe Carrello. Carrello potrebbe avere al suo interno una lista di oggetti Prodotto così:

    codice:
    public class Carrello {
        private List<Prodotto> prodotti = new ArrayList<Prodotto>();
    
        // ....metodi di gestione....
    }

    Scritta così, NON puoi usare un oggetto Carrello direttamente come "target" del for-each.

    codice:
    Carrello carrello = new Carrello();
    // ....
    
    for (Prodotto prodotto : carrello) {     // NO !
        // ....
    }

    Se vuoi che il for-each sopra sia lecito, allora Carrello deve implementare Iterable<Prodotto> e deve avere un iterator() che tira fuori un Iterator<Prodotto>. Come lo implementi? La cosa più banale e veloce è sfruttare e restituire direttamente il Iterator della lista.

    codice:
    public class Carrello implements Iterable<Prodotto> {
        private List<Prodotto> prodotti = new ArrayList<Prodotto>();
    
        // ....metodi di gestione....
    
        public Iterator<Prodotto> iterator() {
            return prodotti.iterator();
        }
    }
    Ultima modifica di andbin; 03-04-2018 a 16:24
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2018
    Messaggi
    46
    Ok ora é chiaro, grazie

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2018
    Messaggi
    46
    Riprendo questa discussione per non aprirne un'altra. Volevo chiedervi una cosa: All'interno della classe Prompt, in cui ho il metodo main, creo un oggetto. Tale oggetto viene dunque creato attraverso il costruttore di un altra classe. Se io volessi usare l'oggetto (creato nel main) nella classe in cui ho il costruttore, come posso fare?
    Nel main faccio: DirectGraph graph = new DirectGraph();
    Nella classe DirectGraph vorrei usare l'oggetto graph. è possibile?

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Giuso Visualizza il messaggio
    Nel main faccio: DirectGraph graph = new DirectGraph();
    Nella classe DirectGraph vorrei usare l'oggetto graph. è possibile?
    Fare riferimento dal costruttore a quella variabile (che tra l'altro è locale al main, quindi non è accessibile al di fuori del main) no, non puoi.
    Ma non ti serve ragionare in questo modo. Perché nei costruttori il this è il riferimento all'oggetto in costruzione.

    Quindi nel costruttore DirectGraph() il this è lo stesso riferimento che verrà poi assegnato a graph.
    Ultima modifica di andbin; 09-04-2018 a 22:06
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2018
    Messaggi
    46
    Quindi se io volessi passare l'oggetto graph nella creazione di un altro oggetto in DirectGraph, non posso?
    Esempio: Miotipo oggetto = new oggetto(graph, i, y)

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