Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] No acabo de entender las referencias a objetos

Estas en el tema de No acabo de entender las referencias a objetos en el foro de Java en Foros del Web. Hola a todos estoy trabajando en un algoritmo y estoy en la parte de leer fichero y rellenar un objeto llamado nodo. Ese fichero nodo ...
  #1 (permalink)  
Antiguo 19/03/2015, 12:53
Avatar de maiksix  
Fecha de Ingreso: noviembre-2014
Ubicación: Sabadell
Mensajes: 124
Antigüedad: 9 años, 5 meses
Puntos: 1
No acabo de entender las referencias a objetos

Hola a todos

estoy trabajando en un algoritmo y estoy en la parte de leer fichero y rellenar un objeto llamado nodo.

Ese fichero nodo tiene 4 variables. Id, Nombre, coordenada x y coordenada y.
En el método readAirports leo el fichero que tiene los nombres y asigno ese nombre (o eso creo) y la id.

Luego quiero que en el método readPositions haga lo mismo pero incorporando el valor decimal del fichero en la coordenada x, y el otro valor en la coordenada y.

El problema es que no se como hacer referencia al mismo objeto desde diferentes métodos, había pensado en un return desde la clase del objeto pero me saltan errores.

He puesto aquí en borrado lo que tengo intención de hacer (en rojo) pero que no se como decírselo exactamente.

A ver si podéis echarme una mano.

Gracias y un saludo!


Código:
public class InputsReader {
	static String archivo_airports_A320="Inputs/A320_Airports.txt";
	static String archivo_positions_A320="Inputs/A320_Position.txt";
	
	public static void readAirports() throws FileNotFoundException, IOException {
	      String cadena;
	      Input inputs = null;
	      int nNodes = 0;
	      FileReader f = new FileReader(archivo_airports_A320);
	      BufferedReader b = new BufferedReader(f);
	      
	   // 1. COUNT THE # OF NODES (# OF LINES IN nodesFilePath)
	      while((cadena = b.readLine())!=null) {
	    		  nNodes++;
	      }
	      b.close();
	   // 2. CREATE THE INPUTS OBJECT WITH nNodes
        inputs = new Input(nNodes); Aquí creo el objeto, como hago para referirme en otro método a este mismo objeto?
        
     // 3. CREATE ALL NODES AND FILL THE NODES LIST
        FileReader fr = new FileReader(archivo_airports_A320);
        BufferedReader br = new BufferedReader(fr);
        
        int k = 0;
        String linea;
        
        while( (linea = br.readLine()) != null )
        {   
      	  
      	  String name=linea;
      	  		float x=0; 
                float y=0;
                Node node = new Node(name,k, x, y);
                
                k++;
            }
        fr.close();
        
        }
	
	public static void readPositions() throws FileNotFoundException, IOException {
	      String cadena;
	      Input inputs = null;
	      int nNodes = 0;
	      FileReader f = new FileReader(archivo_positions_A320);
	      BufferedReader b = new BufferedReader(f);
	         
   // 1. FILL THE NODES LIST WITH ITS POSITION
      FileReader fr = new FileReader(archivo_positions_A320);
      BufferedReader br = new BufferedReader(fr);
      
      String linea;
      
      while( (linea = br.readLine()) != null )
      {     

float x=linea;
Node.Coordenadax=x;
Lo que no se es como hacer que este Node modifique la info del Node que he puesto en el otro método. 

          }
      fr.close();
      }
	}
__________________
Going hard for too long... Can't get enough
  #2 (permalink)  
Antiguo 19/03/2015, 13:46
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: No acabo de entender las referencias a objetos

Buenas,

Tienes que declararlo a nivel de la clase.

Dado que tu método es static, la única forma de hacer referencia a dicho objeto es haciendo una variable de clase también static.

Código Java:
Ver original
  1. public class InputsReader {
  2.     private Input inputs = null;
  3.  
  4. .....
  5.     public static void readAirports() throws FileNotFoundException, IOException {
  6. ....
  7.         inputs = new Input(nNodes);


La referencia input se podrá entonces utilizar desde cualquier método de la clase, sea static o no.

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #3 (permalink)  
Antiguo 19/03/2015, 15:39
Avatar de maiksix  
Fecha de Ingreso: noviembre-2014
Ubicación: Sabadell
Mensajes: 124
Antigüedad: 9 años, 5 meses
Puntos: 1
Respuesta: No acabo de entender las referencias a objetos

Hola!

Gracias por tu respuesta, entiendo lo que quieres decir y ya lo he aplicado.
Lo que no acabo de tener muy claro es lo siguiente
Código:
 // 2. CREATE THE INPUTS OBJECT WITH nNodes
        inputs = new Input(nNodes);
        
     // 3. CREATE ALL NODES AND FILL THE NODES LIST
        FileReader fr = new FileReader(archivo_airports_A320);
        BufferedReader br = new BufferedReader(fr);
        int k = 0;
        String linea;
while( (linea = br.readLine()) != null ){   
      	  
      	  String name=linea;
      	  		float x=0; 
                float y=0;
                Node node = new Node(name,k, x, y); Aquí crea un nodo nuevo y les pasa los valores del primer fichero. Crea tantos nodos como lineas haya.
                k++;
            }
Lo que no pasa es la relación con:

Código:
public class Input {
	/* INSTANCE FIELDS & CONSTRUCTOR */
    public Node[] nodes; // List of all nodes in the problem/sub-problem
    public Input(int n)
    {   nodes = new Node[n]; // n nodes
    }
    /* GET METHODS */
    public Node[] getNodes(){return nodes;}
    }
}
Código:
public class Node {
	/* INSTANCE FIELDS & CONSTRUCTOR */
    public int id; //id of the airport
    public String name; //name of the airport
    public float x; // node x coordinate
    public float y; // node y coordinate

    public Node(String nodeName ,int nodeID, float nodeX, float nodeY)
    {   name=nodeName;
    	id = nodeID;
        x = nodeX;
        y = nodeY;
    }
    /* GET METHODS */
    public String getname(){return name;}
    public int getid(){return id;}
    public float getX(){return x;}
    public float getY(){return y;}
}
Es decir en el primer código se llama al segundo para que inicialize un objeto con un string de tantas posiciones como lineas cuentas.
Luego mientras vuelve a recorrer el fichero guarda el valor en un objeto nodo (3r código) que se crea cada vez que hacemos un salto de linea.

No se debería decir de alguna manera que cada objeto tipo nodo lo guarde en una posición del string del tipo Input? algo como:
Código:
Node node = new Node(name,k, x, y);
Inputs.nodes[k] = node
Como sino puedes leer la información de cada nodo recuperando solamente el string de input?

Gracias! :) Un saludo!
__________________
Going hard for too long... Can't get enough
  #4 (permalink)  
Antiguo 20/03/2015, 01:56
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: No acabo de entender las referencias a objetos

Buenas,

Pues si, deberias hacer como dices. Si no los 'nodes' de Inputs estaran a null y no contendran las referencias a los nodos.

Lo que no tienes ningun sentido es que leas dos veces el mismo fichero: una vez para contar las lineas y otra para escribirlas.
Probablemente Inputs deberia ser una estructura dinamica que se adapte automaticamente. Puedes crear tu mismo facilmente esa estructura con listas enlazadas o bien utilizar alguna de las que provee la api de java, como ArrayList por ejemplo.

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #5 (permalink)  
Antiguo 20/03/2015, 10:21
Avatar de maiksix  
Fecha de Ingreso: noviembre-2014
Ubicación: Sabadell
Mensajes: 124
Antigüedad: 9 años, 5 meses
Puntos: 1
Respuesta: No acabo de entender las referencias a objetos

Hola!

Totalmente cierto Profesor_Falken, he corregido el código para que sólo lea una vez, y uso ArrayList, esto además me permite hacer fácilmente referencia a los "nodes" etc...

Ya está todo solucionado :)

Un saludo! y muchísimas gracias!
__________________
Going hard for too long... Can't get enough

Etiquetas: clase, entender, objetos, referencias, string, valor
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:45.