Visualizzazione dei risultati da 1 a 2 su 2

Discussione: Ciclare una HashMap

  1. #1

    Ciclare una HashMap

    Ciao a tutti, ho creato una classe SparseGraph che rappresenta un grafo orientato pesato.
    Per farlo ho usato una HashMap fatta così:


    codice:
    public HashMap<V,HashMap<V, E>> map = newHashMap<V,HashMap<V, E>>();

    Nella classe ci sono i seguenti metodi (che funzionano):

    codice:
    public E getData(V vertex1, V vertex2){
        if(!hasVertex(vertex1)||!hasVertex(vertex2)) 
            returnnull;
        else
            return map.get(vertex1).get(vertex2);
    }
    
    publicCollection<V> getVertices(){
        return map.keySet();
    }
    
    publicCollection<V> getNeighbors(V vertex){
      if(!hasVertex(vertex)) 
        returnnull;
      else
        return map.get(vertex).keySet();
    }

    Ora dovrei creare un metodo che mi permetta di stampare il grafico usando Graphviz. Quindi questo metodo deve ritornare una stringa come questa:

    codice:
    digraph G {
      "v1"->"v2"[label ="2"];
      "v2"->"v3"[label ="3"];
      "v1"->"v3"[label ="1"];
      "v2"->"v3"[label ="5"];
    }

    Dove "v_i" sono i vertici.
    Il problema è che non so ciclare il grafo. Ho scritto questo codice ma non cicla su tutti i nodi e inoltre non so come risalire al peso degli archi.

    codice:
    publicString print(){
      String g ="digraph G {\n";
      Collection<V> vertices = getVertices();
      for(V v : vertices){
        Collection<V> neighbors = getNeighbors(v);
        for(V n : neighbors){
          g = g +"\t\""+ v +"\" -> \""+ n +"\" [label = \""+ v +"\"];\n";
        }
    
      }
      g = g +"}\n";
      return g;
    }

    Qualcuno potrebbe aiutarmi?
    Grazie mille
    Ultima modifica di stefano86; 29-05-2015 a 10:23

  2. #2
    Utente di HTML.it L'avatar di Nikopol
    Registrato dal
    Jan 2011
    Messaggi
    120
    Ciao, prima di tutto ti consiglio di usare uno StringBuilder quando devi fare così tante modifiche su una stringa.
    non so come risalire al peso degli archi
    Se ho interpretato bene il codice, il peso dovrebbe dartelo il metodo getData passandogli v e n.
    non cicla su tutti i nodi
    Che intendi esattamente? A naso posso dirti che i vertici singoli non connessi non vengono aggiunti alla stringa.
    In particolare quando invochi getNeighbors devi tenere presente che un vertice può anche non avere vicini e quindi il metodo restituisce null, dunque devi fare un controllo dopo il metodo e se non ci sono vicini aggiungi alla stringa solamente il vertice, altrimenti entri nel for interno e aggiungi vertici e archi.
    Personalmente preferirei che getNeighbors restituisse una collezione vuota piuttosto che null, in questo modo eviti anche un potenziale nullpointer nel foreach interno, così come l'hai scritto dovresti fare un null check.

    Qualcosa del genere:
    codice:
    private String createDot() {
        StringBuilder sb = new StringBuilder();
        sb.append("digraph {\n");
        Collection<V> vertices = getVertices();
        for (V v1 : vertices) {
            Collection<V> neighbors = getNeighbors(v1);
            if (neighbors.isEmpty()) {
                sb.append("\t").append(v1).append("\n");
            } else {
                for (V v2 : neighbors) {
                    sb.append("\t").append(v1).append(" -> ").append(v2);
                    sb.append(" [label = ").append(getData(v1, v2));
                    sb.append("]").append("\n");
                }
            }
        }
        sb.append("}");
        return sb.toString();
    }

    Ultima modifica di Nikopol; 30-05-2015 a 02:51
    La Guida Galattica è infallibile.
    È la realtà, spesso, ad essere inesatta.

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.