0

给定以下 XML 这是一个有向图:

<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE graph PUBLIC "-//FC//DTD red//EN" "../dtd/graph.dtd">

<graph direct="1">

    <vertex label="V0"/>
    <vertex label="V1"/>
    <vertex label="V2"/>
    <vertex label="V3"/>
    <vertex label="V4"/>
    <vertex label="V5"/>

    <edge source="V0" target="V1" weight="1"/>
    <edge source="V0" target="V4" weight="1"/>
    <edge source="V5" target="V2" weight="1"/>
    <edge source="V5" target="V4" weight="1"/>
    <edge source="V1" target="V2" weight="1"/>
    <edge source="V1" target="V3" weight="1"/>
    <edge source="V1" target="V4" weight="1"/>
    <edge source="V2" target="V3" weight="1"/>

</graph>

使用这些类,我解析了图并给它一个邻接表表示:

import java.io.IOException;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Collection;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import practica3.util.Disc;

public class ParsingXML {

    public static void main(String[] args) {
        try {
            // TODO code application logic here
            Collection<Vertex> sources = new HashSet<Vertex>();
            LinkedList<String> lines = Disc.readFile("xml/directed.xml");

            for (String lin : lines) {
                int i = Disc.find(lin, "source=\"");
                String data = "";

                if (i > 0 && i < lin.length()) {
                    while (lin.charAt(i + 1) != '"') {
                        data += lin.charAt(i + 1);
                        i++;
                    }
                    Vertex v = new Vertex();
                    v.setName(data);
                    v.setAdy(new HashSet<Vertex>());
                    sources.add(v);

                }

            }



            Iterator it = sources.iterator();

            while (it.hasNext()) {
                Vertex ver = (Vertex) it.next();
                Collection<Vertex> adyacencias = ver.getAdy();
                LinkedList<String> ls = Disc.readFile("xml/graphs.xml");


                for (String lin : ls) {
                    int i = Disc.find(lin, "target=\"");
                    String data = "";

                    if (lin.contains("source=\""+ver.getName())) {
                        Vertex v = new Vertex();
                        if (i > 0 && i < lin.length()) {
                            while (lin.charAt(i + 1) != '"') {
                                data += lin.charAt(i + 1);
                                i++;
                            }
                            v.setName(data);
                        }

                        i = Disc.find(lin, "weight=\"");
                        data = "";

                        if (i > 0 && i < lin.length()) {
                            while (lin.charAt(i + 1) != '"') {
                                data += lin.charAt(i + 1);
                                i++;
                            }
                            v.setWeight(Integer.parseInt(data));
                        }
                        if (v.getName() != null) {
                            adyacencias.add(v);
                        }
                    }
                }
            }


            for (Vertex vert : sources) {
                System.out.println(vert);
                System.out.println("adyacencias: " + vert.getAdy());
            }

        } catch (IOException ex) {
            Logger.getLogger(ParsingXML.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}

这是另一个类:

import java.util.Collection;
import java.util.Objects;

public class Vertex {

    private String name;
    private int weight;
    private Collection ady;

    public Collection getAdy() {
        return ady;
    }

    public void setAdy(Collection adyacencias) {
        this.ady = adyacencias;
    }

    public String getName() {
        return name;
    }

    public void setName(String nombre) {
        this.name = nombre;
    }

    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 43 * hash + Objects.hashCode(this.name);
        hash = 43 * hash + this.weight;
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Vertex other = (Vertex) obj;
        if (!Objects.equals(this.name, other.name)) {
            return false;
        }
        if (this.weight != other.weight) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Vertice{" + "name=" + name + ", weight=" + weight + '}';
    }


}

最后:

/**
 *
 * @author user
 */

/* -*-jde-*- */
/* <Disc.java> Contains the main argument*/

import java.io.*;
import java.util.LinkedList;


/**
 * Lectura y escritura de archivos en listas de cadenas
 * Ideal para el uso de las clases para gráficas.
 *
 * @author Peralta Santa Anna Victor Miguel
 * @since  Julio 2011
 */
public class Disc {

    /**
     * Metodo para lectura de un archivo
     *
     * @param fileName archivo que se va a leer
     * @return El archivo en representacion de lista de cadenas
     */
    public static LinkedList<String> readFile(String fileName) throws IOException {

        BufferedReader file = new BufferedReader(new FileReader(fileName));
        LinkedList<String> textlist = new LinkedList<String>();

        while (file.ready()) {
            textlist.add(file.readLine().trim());
        }

        file.close();
                /*
                for(String linea:textlist){
                    if(linea.contains("source")){
                        //String generado = linea.replaceAll("<\\w+\\s+\"", "");                        
                        //System.out.println(generado);
                    }
                }*/
        return textlist;

    }//readFile


        public static int find(String linea,String palabra){            
            int i,j;
            boolean found = false;
            for(i=0,j=0;i<linea.length();i++){                
                if(linea.charAt(i)==palabra.charAt(j)){
                    j++;
                    if(j==palabra.length()){
                        found = true;                        
                        return i;                      
                    }
                }else{
                    continue;
                }                
            }
            if(!found){
                i= -1;
            }

            return i;                        
        }

    /**
     * Metodo para la escritura de un archivo
     *
     * @param fileName archivo que se va a escribir
     * @param tofile la lista de cadenas que quedaran en el archivo
     * @param append el bit que dira si se anexa el contenido o se empieza de cero
     */
    public static void writeFile(String fileName, LinkedList<String> tofile, boolean append) throws IOException {

        FileWriter file = new FileWriter(fileName, append);

        for (int i = 0; i < tofile.size(); i++) {
            file.write(tofile.get(i) + "\n");
        }

        file.close();
    }//writeFile

    /**
     * Metodo para escritura de un archivo
     * @param msg archivo que se va a escribir
     * @param tofile la cadena que quedaran en el archivo
     * @param append el bit que dira si se anexa el contenido o se empieza de cero
     */
    public static void writeFile(String msg, String tofile, boolean append) throws IOException {
        FileWriter file = new FileWriter(msg, append);
        file.write(tofile);
        file.close();
    }//writeFile

}// 

我被困在给出图形的邻接列表表示的最佳方法上,如何应用它深度优先搜索算法。知道如何完成任务吗?

4

0 回答 0