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

[SOLUCIONADO] ordenar y filtrar hashmap multidimensional

Estas en el tema de ordenar y filtrar hashmap multidimensional en el foro de Java en Foros del Web. Hola.. como va? bueno les cuento.. tengo una base de datos sqlite de productos, con mas o menos 6000 productos. hagamos de cuenta que el ...
  #1 (permalink)  
Antiguo 27/10/2014, 09:51
 
Fecha de Ingreso: enero-2007
Mensajes: 285
Antigüedad: 17 años, 10 meses
Puntos: 21
ordenar y filtrar hashmap multidimensional

Hola.. como va?

bueno les cuento.. tengo una base de datos sqlite de productos, con mas o menos 6000 productos.

hagamos de cuenta que el producto tiene, id, marca, rubro, descripcion y precio.

tengo que hacer un filtrado y un ordenado de los productos por varios campos..

esto se muestra en una vista previa de un pdf.. el problema es que si lo hago directo del sqlite., en cada cambio del las vista previa. tengo que rehacer la consulta, y pense que andaria mas rapido si almaceno todos los datos en un hashmap.

el tema es que no se ordenarlo, por varios parametros..

el hash map seria algo asi..

Código:
  HashMap <Integer, HashMap<String, String>> mapa = new HashMap();
        
         HashMap <String,String> producto = new HashMap();
         producto.put("id", "1");
         producto.put("marca", "");
         producto.put("rubro", null);
         producto.put("descripcion", null);
         producto.put("precio", null);
         
         mapa.put(1, producto);

// y asi se irian metiendo todos los productos
y necesitaria poder ordenarlo por marca, luego por rubro y luego por decripcion.

yo fui a hashmap, por que, debido a mis excasos conocimientos, pero si me dicen.. te conviene usar hashtable, linkedhasmap, arraylist, o incluso json.. acepto..

tambien trate de usar json.. pero tampoco consegui ni ordenarlo ni filtrarlo.

desde ya muchas gracias.
  #2 (permalink)  
Antiguo 27/10/2014, 12:55
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: ordenar y filtrar hashmap multidimensional

Buenas,

http://docs.oracle.com/javase/7/docs...l/HashMap.html

Como puedes ver en la documentación, HashMap es excelente por su rendimiento, ya que las operaciones básicas como put o get se realizan en tiempo constante O(1), gracias a su implementación basada en tabla de dispersión.

Sin embargo, como verás en la segunda linea de la documentación, esta implementación tiene un problema:
"This class makes no guarantees as to the order of the map; in particular, it does not guarantee that the order will remain constant over time"

No sirve para ordenar elementos.

En cuanto a las alternativas que comentas:
hashtable: es una HashMap sincronizada, util en los casos en los que haya concurrencia. Sin embargo, esta sincronizacion tiene un coste: su rendimiento es mucho peor.
linkedHashmap: es una implementación de hashmap basada en listas enlazadas. Permite ordenación pero pierde las ventajas que ofrece el mapa. Al final funciona en realidad como una lista.
json: muy útil en lenguajes dinámicos como Python o Javascript (en este último la integración es total ya que lo soporta de forma nativa), pero en Java resulta un poco más engorroso debido a su naturaleza de tipado fuerte y estático.

ArrayList: esta implementación de lista me parece una buena solución para tu problema.


Deberías comenzar por crearte una clase producto:

class Producto {
private long id;
private String marca;
[...]


gets y sets publicos
}

Después cuando recuperes de la base de datos te vas creando una lista de Producto.

List<Producto> productos = new ArrayList<>();
//Recupero de base de datos
for (elemento en base de datos) :
Producto producto = new Producto();
producto.setId
producto.setMarca
etc

productos.add(producto)


Por último, esta lista la podras ordenar facilmente mediante el método sort e implementando el Comparator que necesites.
http://www.mkyong.com/java/java-obje...nd-comparator/

Ya nos vas contando.


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #3 (permalink)  
Antiguo 28/10/2014, 18:44
 
Fecha de Ingreso: mayo-2010
Mensajes: 99
Antigüedad: 14 años, 6 meses
Puntos: 5
Respuesta: ordenar y filtrar hashmap multidimensional

Wenas puedes usar de esta forma la clase producto

Código:
import java.util.Comparator;
import com.test.Person;

public class Producto {

	private long id;
	private String marca;
	private String rubro;
	private String descripcion;
	private float precio;
    
	public Producto(){
	}
	
	public Producto(long id,String marca,String rubro,String desc,float price){
		this.id=id;
		this.marca=marca;
		this.rubro=rubro;
		this.descripcion=desc;
		this.precio=price;
	}

	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getMarca() {
		return marca;
	}

	public void setMarca(String marca) {
		this.marca = marca;
	}

	public float getPrecio() {
		return precio;
	}

	public void setPrecio(float precio) {
		this.precio = precio;
	}

	public String getRubro() {
		return rubro;
	}

	public void setRubro(String rubro) {
		this.rubro = rubro;
	}

	 public String toString() {
	        //return id + " " + marca + " " + rubro + " " +descripcion + " " +precio;
	        return String.format("%-16.20s %-30.30s %-20.30s %-25.30s %-20.30s",id,marca,rubro,descripcion,precio);
	    }
	
	 // Comparator
    public static class CompId implements Comparator<Producto> {
        
        public int compare(Producto arg0, Producto arg1) {
            return (int) (arg0.id - arg1.id);
        }
    }

    public static class CompMarca implements Comparator<Producto> {
        
    	public int compare(Producto arg0,Producto arg1) {
    		// TODO Auto-generated method stub
    		return arg0.marca.compareTo(arg1.getMarca());
    	}
    }
    
    public static class CompRubro implements Comparator<Producto> {
        private boolean orderby=false;
        public CompRubro(boolean desc){
        	this.orderby=desc;
        }
    	public int compare(Producto arg0,Producto arg1) {
    		// TODO Auto-generated method stub
    		int i=0;
    		if(orderby){
    			i=arg0.rubro.compareTo(arg1.getRubro());
    		}else{
    			i=arg1.rubro.compareTo(arg0.getRubro());
    		}
    		return i;//arg0.rubro.compareTo(arg1.getRubro());
    	}
    }
    
    public static class CompPrice implements Comparator<Producto> {
    	private float mod = 1;
        public CompPrice(boolean desc) {
            if (desc) mod =-1;
        }
    	public int compare(Producto arg0,Producto arg1) {
    		// TODO Auto-generated method stub
    		return (int) ((int) mod*(arg0.precio - arg1.precio));
    	}
    }
	
}
Y en el main usar esto


Código:
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;
import java.util.Comparator;

import com.test.Person;

public class testProductosort {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Producto p = null;
		Producto p1 = new Producto();
		
		List<Producto> lstpro = new ArrayList<Producto>();
		
		lstpro.add(new Producto(4,"palmolive","jabon","jabon bano",5.80f));
		lstpro.add(new Producto(9,"dove","jabon","jabon bano",7.80f));
		lstpro.add(new Producto(1,"escudo","jabon","jabon bano",8.50f));
		lstpro.add(new Producto(5,"palma","jabon","jabon bano",10.50f));
		lstpro.add(new Producto(2,"palma","shampo","jabon bano",10.50f));
		lstpro.add(new Producto(6,"acros","lavadora","lavadora 11kgs",89.50f));
		lstpro.add(new Producto(8,"whirpol","lavadora","lavadora 15kgs",150.50f));
		lstpro.add(new Producto(3,"samsung","lavadora","lavadora 15kgs",148.50f));
		lstpro.add(new Producto(3,"acros","estufa","estufa 4 quemadores",248.50f));
		
		System.out.println("-----ANTES DE ORDENAR----");
		System.out.println(String.format("%-16.20s %-30.30s %-20.30s %-25.30s %-20.30s","ID","MARCA","RUBRO","DESCRIPCION","PRECIO")+"\n");
	    for (Producto pr : lstpro) {
	        System.out.println(pr.toString());
	    }
		
	    System.out.println("-----DESPUES DE ORDENAR BY ID----");
		Collections.sort(lstpro,new Producto.CompId());
		System.out.println(String.format("%-16.20s %-30.30s %-20.30s %-25.30s %-20.30s","ID","MARCA","RUBRO","DESCRIPCION","PRECIO")+"\n");
	    for (Producto pr : lstpro) {
	        System.out.println(pr.toString());
	    }
		
	    System.out.println("-----DESPUES DE ORDENAR BY MARCA----");
	    Collections.sort(lstpro,new Producto.CompMarca());
	    System.out.println(String.format("%-16.20s %-30.30s %-20.30s %-25.30s %-20.30s","ID","MARCA","RUBRO","DESCRIPCION","PRECIO")+"\n");
	    for (Producto pr : lstpro) {
	        System.out.println(pr.toString());
	    }
	    
	    
	    System.out.println("-----DESPUES DE ORDENAR BY PRECIO ASC----");
	    Collections.sort(lstpro,new Producto.CompPrice(false));
	    System.out.println(String.format("%-16.20s %-30.30s %-20.30s %-25.30s %-20.30s","ID","MARCA","RUBRO","DESCRIPCION","PRECIO")+"\n");
	    for (Producto pr : lstpro) {
	        System.out.println(pr.toString());
	    }
	    
	    
	    System.out.println("-----DESPUES DE ORDENAR BY PRECIO DESC----");
	    Collections.sort(lstpro,new Producto.CompPrice(true));
	    System.out.println(String.format("%-16.20s %-30.30s %-20.30s %-25.30s %-20.30s","ID","MARCA","RUBRO","DESCRIPCION","PRECIO")+"\n");
	    for (Producto pr : lstpro) {
	        System.out.println(pr.toString());
	    }
	    
	    
	    System.out.println("-----DESPUES DE ORDENAR BY RUBRO ASC----");
	    Collections.sort(lstpro,new Producto.CompRubro(false));
	    System.out.println(String.format("%-16.20s %-30.30s %-20.30s %-25.30s %-20.30s","ID","MARCA","RUBRO","DESCRIPCION","PRECIO")+"\n");
	    for (Producto pr : lstpro) {
	        System.out.println(pr.toString());
	    }
	    
	    
	    System.out.println("-----DESPUES DE ORDENAR BY RUBRO DESC----");
	    Collections.sort(lstpro,new Producto.CompRubro(true));
	    System.out.println(String.format("%-16.20s %-30.30s %-20.30s %-25.30s %-20.30s","ID","MARCA","RUBRO","DESCRIPCION","PRECIO")+"\n");
	    for (Producto pr : lstpro) {
	        System.out.println(pr.toString());
	    }
	}

}
Saludos, espero te oriente como dijo el Profe
  #4 (permalink)  
Antiguo 12/12/2014, 12:59
 
Fecha de Ingreso: enero-2007
Mensajes: 285
Antigüedad: 17 años, 10 meses
Puntos: 21
Respuesta: ordenar y filtrar hashmap multidimensional

Abulon y profe.. muuuuuuuuuuchas gracias por su tiempo... voy a ir viendo.. en cuanto altema de los productos.. el problema es que los productos no siempre tienen ni los mismos campos.. ni siquiera la misma cantidad de columnas.. para una implementacion puede tener 4 columnas y para otra nose.. 15.. por eso.. no me decidi por crear un objeto. y por eso me quedaba con el linkedhashmap obtenido de la sqlite. incluso.. fue asi como termino quedando..

es decir.. hacia la consulta al sql ya ordenada y la metia en el linkedhashmap y ahi bueno me quedo el catalogo ordenado.

de todas formas voy a revisar esto que ponen para tenerlo en cuenta para otra oportunidad y para aprender.... de nuevo reitero mi agradecimiento por su tiempo.

Etiquetas: json
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 14:01.