java - objetos - ¿Cómo extraer un campo de un objeto almacenado en una lista de arrays?
lista de objetos java (2)
¿Puedo obtener algunos ejemplos de código de trabajo que puedo separar y estudiar cómo funcionan? Específicamente, necesito averiguar cómo obtengo el campo de dirección del objeto numerado x en mi lista? ¿Cómo elimino el objeto xth de la lista? ¿Cómo configuro el campo de precio del objeto x a un nuevo valor?
Entiendo cómo houseList.add coloca los datos en un nuevo objeto que se adjunta al final de la lista, pero no entiendo lo contrario y cómo orientar un objeto específico y manipularlo. Por favor, muestre un ejemplo multi-clase que funcione. ¡Gracias!
La clase que crea el objeto House y contiene la siguiente información;
public House(int address, String street, double price, int rooms) {
this.address = address;
this.street = street;
this.price = price;
this.rooms = rooms;
}
y tiene los siguientes métodos ...
public void SetAddress (int address){
setAddress(address);
}
private void setAddress (int address){
this.address = address;
}
public int GetAddress (int address){
address = getAddress(address);
return address;
}
private int getAddress (int address){
return address;
}
@Override
public String toString() {
return address + " " + street + " " + price + " " + rooms;
}
etc ...
En otra clase, declaro un objeto de List of House llamado houseList y que es un ArrayList.
List<House> houseList;
houseList = new ArrayList();
y puede llenarlo con datos,
houseList.add(new House(this.address, this.street, this.price, this.rooms));
e iterar a través de él ...
public void showHouses() {
Iterator<House> itr = houseList.iterator();
while (itr.hasNext()) {
System.out.println(itr.next().toString());
}
}
Hasta este punto, ninguno de los métodos de mi Casa, tal como se menciona anteriormente, entran en juego, excepto el método toString que ha sido anulado. Lo que no he podido descifrar es cómo sacar esta.salud o este.precio para el elemento xx de la lista. Puedo colocar datos en la lista con houseList.add (new House (this.address, this.street, this.price, this.rooms));
y puedo ver que mis datos se almacenan como se espera cuando se repiten. Tengo estos setters y getters, pero no entiendo cómo se van a utilizar para sacar estos elementos o configurarlos. Desde que utilicé houseList.add, pensé que lo contrario de add sería get, pero have not descubrió la sintaxis correcta.
itr.next()
devuelve el siguiente objeto de casa disponible de la lista. Debe llamar a métodos en ese objeto de la casa.
Ejemplo:
while (itr.hasNext()) {
House hs = itr.next();
System.out.println(hs.getAddress(input));
System.out.println(hs.toString());
}
Reparación de getters
Primero, tratar con los getters / setters. El siguiente getter:
private int getAddress (int address){
return address;
}
debería arreglarse para que se vea así:
private int getAddress() {
return address;
}
En su código, su getAddress(int address)
tiene un parámetro int y devuelve el argumento directamente. Ni siquiera mira el campo que almacena el valor de la dirección.
Iterando sobre la lista
Puedes reescribir esto:
public void showHouses() {
Iterator<House> itr = houseList.iterator();
while (itr.hasNext()) {
System.out.println(itr.next().toString());
}
}
de una manera más compacta, usando un estilo Java-5 for
loop, como este:
public void showHouses() {
for (House house : houseList) {
System.out.println(house);
// or, say: System.out.println(house.getAddress());
}
}
o así, si realmente quieres usar un iterador:
public void showHouses() {
Iterator<House> itr = houseList.iterator();
while (itr.hasNext()) {
House house = itr.next();
System.out.println(house);
// or, say: System.out.println(house.getAddress());
}
}
Tenga en cuenta que en el ejemplo anterior, normalmente debe tener cuidado de llamar a next()
solo una vez por iteración. Es decir: asigne itr.next()
a una variable local y itr.next()
lugar de invocar itr.next()
más de una vez por iteración.
La ventaja de la primera manera es que es más corta; y está claro que todo lo que estás haciendo es iterar sobre la colección y no modificarla de ninguna manera (aunque aún puedes modificar sus valores).
La ventaja de la segunda forma es que puede invocar itr.remove()
para eliminar elementos de la colección a medida que la recorre (itera).
La xva casa
Si necesita la xva casa, puede escribir:
int x = ...;
House h = houseList.get(x);
System.out.println(h);
// or: System.out.println(h.getAddress());
.
Editar:
Aquí hay un patrón más que a veces se ve en el código que atraviesa una lista:
for (Iterator<House> it = houseList.iterator(); it.hasNext();) {
House house = it.next();
// Blah, blah..
}
Esto tiene las mismas ventajas que el recorrido basado en iterador anterior. Sin embargo, esta versión limita el alcance de la variable del iterador ( it
) al cuerpo del bucle. En la versión anterior, el alcance de la variable del iterador es todo el cuerpo del método. Por lo tanto, es más fácil ver que nunca se usa el iterador fuera del ciclo.
Limitar el alcance al cuerpo del bucle también es útil cuando desea realizar más de un recorrido basado en un iterador en un método (u otro bloque). También le permite volver a utilizar el mismo nombre de variable para el segundo ciclo (incluso si el segundo ciclo itera sobre una colección de un tipo diferente).