Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Contenedor de datos

Hola necesito un contenedor de datos para almacenar los datos: Producto->candidad. He probado con la clase Pair pero no me permite modificar la cantidad. Tambien he probado con un HashMap pero no me deja acceder a los atributos del objeto producto. ¿Que colección de datos me recomiendan que utilice?

agosto 12, 2015 | Unregistered CommenterManolo Camacho

Si usas un HashMap, supongo que estarás usando como clave objetos de clase Producto, con lo cual para acceder a una entrada concreta ya tendrías el objeto Producto y, por tanto, acceso a sus propiedades. Por ejemplo (meto secuencias "_." para sangrar el código):


// miHashMap<Producto, Integer> es la colección en la que tienes
// la información.

// Para acceder a una línea concreta, ya deberías tener tú el
// producto:
public int getCantidadSolicitada(Producto p) {
_._.return miHashMap.get(p);
}

Si quieres obtener la lista de todos los productos usados como clave en el HashMap, utiliza el método keySet();


public Set<Product> getListaProductos() {
_._.// Recuerda que, en un HashMap, no puede haber más de una línea
_._.// con la misma clave, por lo que obtienes un Set en el que nunca
_._.// se repetirá el mismo objeto Producto...
_._.// ...aunque podrías tener dos objetos distintos con el mismo código
_._.// de producto. :-)
_._.return miHashMap.keySet();
}

Otra opción que te puede resultar más sencilla es usar composición y crear una lista de los objetos compuestos:


public class LineaDetalle {
_._.private Producto p;
_._.private int cantidad;
_._.// Otras propiedades que te puedan interesar

_._.// Getters y setters
}

...(en otra clase que gestione la lista, por ejemplo un gestor de pedidos)...
List<LineaDetalle> datos = new ArrayList<>();

public void anadeLineaDetalle(Producto p, int cantidad) {
_._.datos.add(new LineaDetalle(p, cantidad));
}

public LineaDetalle buscaLineaDetalle(Producto p) {
_._.for(LineaDetalle d : datos) {
_._._._.if (d.getProducto().equals(p)) {
_._._._._._.return d;
_._._._.}
_._.}
_._.return null;
}

public Iterator<LineaDetalle> iterator() {
_._.return datos.iterator();
}

Como ves, si usas esta segunda opción, tienes que gestionarte tú las búsquedas, pero a cambio podrías tener dos líneas con el mismo producto.

agosto 12, 2015 | Registered Commenterrickiees