es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo reducir un Map en Java después de borrar uno de sus elementos (objetos)?

Supongamos que se me da un mapa representado como {[A, 0], [B, 1] [C, 2], [D, 3], [E, 4], [F, 5], [G, 6]} y se elimina uno de sus elementos, es decir [E, 4], entonces mi nuevo mapa se convertiría en {[A, 0], [B, 1] [C, 2], [D, 3], [F, 5], [G, 6]}. ¿Cómo puedo redimensionar o reducir este mapa para que los elementos cuyo índice es mayor que el índice del elemento eliminado, disminuyan su índice (Valor) en uno, como esto {[A, 0], [B, 1] [C, 2], [D, 3], [F, 4], [G, 5]}? Además de esto, ¿cómo puedo ajustar el tamaño de la matriz ArrayList<ArrayList<GraphEdge<L>>>?

Nota: La asignación del índice a los nodos debe seguir el orden de inserción, por lo tanto, el primer nodo insertado en el grafo debe tener asignado el índice 0, el segundo el índice 1 y así sucesivamente.

El código Java:

@Override
public void removeNode(GraphNode<L> node) {
if (node == null) {
throw new NullPointerException();
}
if (!this.nodesIndex.containsKey(node)) {
throw new IllegalArgumentException();
}

// Implementar aquí
}

@Override
public boolean addNode(GraphNode<L> node) {
if (node == null) {
throw new NullPointerException();
}
if (this.nodesIndex.containsKey(node)) {
return false;
}

// Implementar aquí
}

El mapa que contiene sus elementos (Keys) asociados a sus índices (Values) se representa de la siguiente manera:

/*
* Un conjunto de nodos en el que cada nodo está asociado a su índice en la matriz de adyacencia
*/
protected Map<GraphNode<L>, Integer> nodesIndex = new HashMap<GraphNode<L>, Integer>();

Mientras que la matriz se representa de la siguiente manera:

/*
* La matriz de adyacencia en la que sus elementos son nulos u objetos de la clase GraphEdge<L>. El uso de ArrayList permite que la matriz se redimensione gradualmente cada vez que se agrega o elimina un nuevo objeto (elemento).
*/
protected ArrayList<ArrayList<GraphEdge<L>>> matrix = new ArrayList<ArrayList<GraphEdge<L>>>();

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para redimensionar o reducir el mapa después de eliminar un elemento, puedes iterar a través de los elementos restantes en el mapa y decrementar su índice (valor) si es mayor que el índice del elemento eliminado. Aquí hay una implementación del método removeNode para lograr esto:

    @Override
    public void removeNode(GraphNode<l> node) {
        if (node == null) {
            throw new NullPointerException();
        }
        if (!this.nodesIndex.containsKey(node)) {
            throw new IllegalArgumentException();
        }
    
        int indexToRemove = this.nodesIndex.get(node);
        this.nodesIndex.remove(node);
    
        // Decrementar el índice de los nodos restantes si es mayor que el índice del nodo a eliminar
        for (GraphNode<l> key : this.nodesIndex.keySet()) {
            int index = this.nodesIndex.get(key);
            if (index > indexToRemove) {
                this.nodesIndex.put(key, index - 1);
            }
        }
    
        // Ajustar el tamaño de la matriz al eliminar la fila y la columna correspondiente al índice del nodo eliminado
        for (int i = 0; i < this.matrix.size(); i++) {
            this.matrix.get(i).remove(indexToRemove);
        }
        this.matrix.remove(indexToRemove);
    }
    

    Para ajustar el tamaño de la matriz ArrayList<><><l>>>, puedes usar el mismo enfoque que para el mapa. Después de eliminar un nodo, debes eliminar la fila y la columna correspondiente a su índice en la matriz. Aquí hay una implementación del método removeNode que también redimensiona la matriz:

    @Override
    public void removeNode(GraphNode<l> node) {
        if (node == null) {
            throw new NullPointerException();
        }
        if (!this.nodesIndex.containsKey(node)) {
            throw new IllegalArgumentException();
        }
    
        int indexToRemove = this.nodesIndex.get(node);
        this.nodesIndex.remove(node);
    
        // Decrementar el índice de los nodos restantes si es mayor que el índice del nodo a eliminar
        for (GraphNode<l> key : this.nodesIndex.keySet()) {
            int index = this.nodesIndex.get(key);
            if (index > indexToRemove) {
                this.nodesIndex.put(key, index - 1);
            }
        }
    
        // Ajustar el tamaño de la matriz al eliminar la fila y la columna correspondiente al índice del nodo eliminado
        for (int i = 0; i < this.matrix.size(); i++) {
            this.matrix.get(i).remove(indexToRemove);
        }
        this.matrix.remove(indexToRemove);
    }
    

    Nota que ambas implementaciones asumen que el mapa nodesIndex y el ArrayList matrix han sido configurados y actualizados correctamente antes de llamar al método removeNode.

Comments are closed.