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.

Problema de Java: no se puede referenciar desde un contexto estático (en el algoritmo de construcción del árbol de búsqueda binaria).

Cuando asigno un nuevo valor a mi árbol de búsqueda binaria de la misma manera en que lo hace mi función de método de entrada, el programa informa un error diciendo que no se puede hacer referencia desde un contexto estático. (esta línea a.root.left = new Node("dd",22) dice que Node no es estático)

Este es mi programa:

“`paquete trylang;

import java.util.Arrays;

public class tryBSTnode<Key extends Comparable<Key>, Value> {
private Node root;
private class Node{
private Key key;
private Value value;
private Node left, right;
public Node(Key key, Value val){
this.key = key;
this.value = val;
}
}
public tryBSTnode(){

<pre><code>}

public void put(Key key, Value val){
root = put(root,key,val);
}

public Node put(Node nd, Key key, Value val){
if (nd == null) return new Node(key, val);
int cmp = key.compareTo(nd.key);
if (cmp>0) nd.right = put(nd.right,key,val);
else if (cmp<0) nd.left = put(nd.left, key, val);
else nd.value = val;
return nd;
}
public static void main(String[] args) {
tryBSTnode<String, Integer> a = new tryBSTnode<String, Integer>();
a.put("aa",20);
a.put("bb",67);
a.put("cc",67);
a.root.left = new Node("dd",22); //esta línea tiene un problema
}
</code></pre>

}

<pre><code><br />El método put se basa en la lógica de que cuando el nodo es nulo, podemos asignarle un nuevo nodo.
“`java
public Node put(Node nd, Key key, Value val){
if (nd == null) return new Node(key, val);
int cmp = key.compareTo(nd.key);
if (cmp>0) nd.right = put(nd.right,key,val);
else if (cmp<0) nd.left = put(nd.left, key, val);
else nd.value = val;
return nd;
}

La estructura del árbol sería así: root(aa,20)->right(bb,67)->right(cc,67), y al ejecutar el método put no encontramos ningún error. El lado izquierdo de la raíz es nulo. Sin embargo, cuando quiero asignar un nuevo nodo al lado izquierdo del árbol, IntelliJ dice que esta línea a.root.left = new Node("dd",22) no se puede hacer referencia desde un contexto estático. ¿Por qué esta línea puede funcionar en el método put, pero tiene un error en el método main?

Tags:  ,

Answer

  1. Avatar for davy.ai

    La razón por la cual la línea a.root.left = new Node("dd",22); tiene un error que dice “no se puede hacer referencia desde un contexto estático” en el método principal es porque la clase interna Node no está declarada como estática.

    En Java, los métodos o campos estáticos pertenecen a la clase misma y no a una instancia en particular de la clase. Esto significa que solo pueden acceder a otros métodos o campos estáticos.

    Dado que la clase interna Node en el código no está declarada como estática, pertenece a la instancia de la clase externa. Esto significa que para acceder a ella, primero debes tener una instancia de la clase externa.

    En el método put, ya estás invocándolo en una instancia de la clase externa (nd), por lo que puedes acceder a la clase interna Node sin ningún problema.

    Sin embargo, en el método principal, estás intentando acceder a la clase interna Node directamente sin una instancia de la clase externa, de ahí el error.

    Para solucionar este error, debes declarar la clase interna Node como estática o crear una instancia de la clase externa antes de acceder a la clase interna Node.

    Aquí tienes un ejemplo de cómo crear una instancia de la clase externa antes de acceder a la clase interna Node:

    tryBSTnode<string, integer=""> a = new tryBSTnode<string, integer="">();
    a.put("aa",20);
    a.put("bb",67);
    a.put("cc",67);
    tryBSTnode<string, integer="">.Node leftNode = a.new Node("dd",22);
    a.root.left = leftNode;
    

    Esto crea una nueva instancia de la clase tryBSTnode llamada a y luego crea una nueva instancia de la clase interna Node llamada leftNode. Finalmente, asigna leftNode al campo left del nodo root en la instancia a.</string,></string,></string,>

Comments are closed.