cómo arreglar una lista privada que se modifica en otra clase

para un proyecto escolar nos pidieron que hiciéramos el algoritmo de dijkstra. Tengo las clases: Node, Edge, graph y Dijkstra usando graph.getNodes (devuelve una Lista) y lo almacena en una variable local en findPath (en djikstra) después de usar find path graph.getnodes devuelve una lista de tamaño 5 en lugar de getNodes es de graph.java findPath es de Djikstra.java

public List<Node> getNodes() {
    return nodes;
}

public void findPath (Node s, Node d) {
        System.out.println("nodeSize at begining of findpath : "+graph.getNodes().size());
        List<Node> nodes = graph.getNodes();
        dijkstraTable = new Map[nodes.size()];
        //verify paramaters
        if(!nodes.contains(s)) throw new InvalidParameterException("the source node is not valid");
        if(!nodes.contains(d)) throw new InvalidParameterException("the destination node is not valid");
        if(s == null || d == null ) throw new NullPointerException("s or d are null");
        Edge edge0 = new Edge(s,s,0);
        Map<Node,Edge> map = new HashMap<Node,Edge>();
        map.put(s, edge0);
        int i =0;
        dijkstraTable[i] = map;
        //iteration > 0 
        while(!nodes.isEmpty()) {
            i++;
            if (i==nodes.size()) break;
            Map<Node,Edge> newMap = new HashMap<Node,Edge>();
            map = dijkstraTable[i-1]; //last iteration map 
            //get minimum last iteration
            Node min = getMinimum(map);
            //mark it as "visited" 
            nodes.remove(min);
            //add it to the path
            List<Edge> edges = graph.getEdgesGoingFrom(min);
            System.out.println("nodeSize in loop: "+graph.getNodes().size());
            for(Edge edge : edges) {
                Node key = edge.getDestination();
                if(!map.containsKey(key)) { //create it if doesnt exist
                    newMap.put(key, edge);
                }else { //make sure to have the minimum value
                    if(getMinimum(map.get(key), edge) == edge) newMap.put(key, edge);
                    else newMap.put(key, map.get(key));
                }
            }//endfor
            path.add(map.get(min));
            dijkstraTable[i] = newMap;
        }
        System.out.println("nodeSize at end of findpath : "+graph.getNodes().size());
    }

la salida es

nodeSize al comienzo de findpath: 7

nodeSize en bucle: 6

nodeSize en bucle: 5

nodeSize en bucle: 5

nodeSize en bucle: 5

nodeSize al final de findpath: 5

debería haber sido un 7 cada vez

Respuesta 1

Tu problema está aquí:

public List<Node> getNodes() {
    return nodes;
}
...

List<Node> nodes = graph.getNodes();

Está modificando su lista "privada" en el método findPath. Si desea evitar modificaciones, use Collections.unmodifiableList(nodes)int getNodes()o cree una nueva lista findPathy pase graph.getNodes()al constructor de la lista.

Respuesta: 2

Tengo un único InputStream o String con dos xmls, así: <? Xml version = "1.0" standalone = "yes"?> <Items blahblahblah1 </items> <? Xml version = "1.0" ...

Estoy desarrollando una herramienta que consulta las actualizaciones del sistema externo y esta consulta se basa en el valor del tiempo de actualización que se representa como una representación de fecha interna de Excel, respectivamente, a los segundos ...

Estoy generando un archivo PDF usando com.itextpdf.text. * El siguiente es mi código que crea el archivo PDF con título y encabezado resaltados y filas, lo que quería hacer es crear un archivo PDF con imagen en ...

¿Alguien sabe la razón por la que Flux.onErrorContinue argumentos como el siguiente tipo: public final Flux <T> onErrorContinue (BiConsumer <Throwable, Object> errorConsumer) {...} en su lugar ...