HashMap com listas[Resolvido]

7 respostas
E

Ola pessoal tudo bem!!

esto com o seguinte problema tenho um HashMap que nele tem alguns dados de um arquivo propertie, onde eu esto lendo este arquivo e colocando
ele num HashMap , onde a chave do propertie é a chave no meu HashMap, e o valor sao os item desse arquivo que no HashMap eu coloco numa List.

Exemplos:

HashMap<String, List<Problema>>

Methodo responsavel por esta ação:

public HashMap<String, List<Problema>> lerArquivoProblema(String caminhoArquivo){

File f = new File("C:\Documents and Settings\Rafael\Desktop\problemas.properties");
        Properties arquivo = new Properties();
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(f);

            arquivo.load(fis);
            fis.close();
        } catch (FileNotFoundException ex) {
            TTILogger.getLogger().log(Level.FINE, "Arquivo properties nao achado", ex);
            return null;
        } catch (IOException ex) {
            TTILogger.getLogger().log(Level.FINE, "Erro no modulo de problema", ex);
            return null;
        }

        HashMap<String, List<Problema>> listaProblemas = new HashMap<String, List<Problema>>();

        Enumeration chaves = arquivo.keys();


        List<Problema> problemasArquivo;

        while (chaves.hasMoreElements()) {

            String problemaMae = (String) chaves.nextElement();

            problemasArquivo = new ArrayList<Problema>();

            String problemaFilho = arquivo.getProperty(problemaMae);


            String[] token = problemaFilho.split(",");

            for (String a : token) {

                Problema problema = new Problema();

                problema.setDescricao(a);

                problema.setSuperTopico(problemaMae);

                problemasArquivo.add(problema);
            }


            listaProblemas.put(problemaMae, problemasArquivo);


        }


        return listaProblemas;
    }

Essa classe Problema e uma Entidade vo posta o codigo:

public class Problema implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int codigoProblema;
    private String descricao;
    private int quantidade;
    private String superTopico;
    
    @ManyToMany
    private Collection<Chamado> idChamado;

    @ManyToOne
    private Resultado resutado;
    
    @OneToOne(mappedBy = "problema")
    private AjudaProblema resulocaoProblema;

OBS: Não postei os methodos gets e sets.

pessoal e bem simples que quero fazer mas não esto conseguindo. Eu quero pegar esse Hash e compara com uma List de problema que vem do banco de dados, onde descrição do problema se for igual ele so atualiza se for diferente ele salva no banco!!

alguem pode me ajudar com este problema?

esto usando o seguinte methodo para realizar isto:

public HashMap<String, List<Problema>> checarProblemaBanco(HashMap<String, List<Problema>> problemas) {

        List<Problema> problemaBanco = this.daoProblema.consultar();

        List<Problema> problemaLista = new ArrayList<Problema>();

        List<Problema> checa = new ArrayList<Problema>();

        if (problemas != null) {

            Collection chaves = problemas.keySet();

            Iterator<String> iten = chaves.iterator();

            while (iten.hasNext()) {

                String chave = (String) iten.next();


                List<Problema> po = problemas.get(chave);

                for (Problema a : po) {

                    problemaLista.add(a);

                }
            }
            for(Problema t : problemaLista) {

                for(Problema h :problemaBanco){


                    if(t.getDescricao().equals(h.getDescricao())){

                         System.out.println("Em "+t.getDescricao() +"  "+ t.getSuperTopico());

                         break;

                    }else{

                        System.out.println("nao e igual " +t.getDescricao()+ " Em " +t.getSuperTopico());
    
                    }
                }

            }

        }
        return null;
    }

nao esto colocanado os methodos de salva e atualizar no banco de dados pos não esta funcionando correto.

7 Respostas

Giulliano

O que exatamente não funciona ???

pelo código q vc postou, esta td normal, fiz algumas alterações mas nada que modifique a sua lógica inicial.

public HashMap<String, List><Problema>> checarProblemaBanco(HashMap<String, List><Problema>> hashProblemas) {  
		  
        final List<Problema> problemasBase = this.daoProblema.consultar();
        final List<Problema> problemas = new ArrayList<Problema>();  

        if (hashProblemas != null) {  
            Set<String> chaves = hashProblemas.keySet();  
            Iterator<String> iten = chaves.iterator();  
            while (iten.hasNext()) {  
                String chave = (String) iten.next();  
                problemas.addAll(hashProblemas.get(chave));  
            }  

            for(Problema t : problemas) {  
                for(Problema h :problemasBase){  
                    if(t.getDescricao().equals(h.getDescricao())){  
                         System.out.println("Em "+t.getDescricao() +"  "+ t.getSuperTopico());  
                         break;  
                    }else{  
                        System.out.println("nao e igual " +t.getDescricao()+ " Em " +t.getSuperTopico());  
                    }  
                }  
            }  
        }  
        return null;
    }
nel

Só eu estou achando isto bem confuso? :shock:

Mas efetue o foreach diretamente no seu Hash, dentro deste for, você terá para cada “chave” uma Lista com seus respectivos valores.
Pelo o que eu pude entender, esta lista pode conter N problemas, perfeito?

Então, itere sobre estas lista e efetue a comparação.
Tem algo que seria bem interessante, você utilizar a interface Comparable.

Dê uma pesquisada, que acho que vai lhe ajudar!

Abraços!

E

e isso mesmo nell!!

Giulliano obrigado pela sua resposta mas o problema fica no banco de dados do jeito que esta,
ele acaba atualizando tudo e a descricao do problema fica com o ultimo, se eu troca o methodo de atualizar para excluir funcional legal!!

so que o problema e que acaba apagando a chave primaria!!

mas vo dar uma pesquisada sobre a dica que voçe me deu nell obrigado e Giulliano .

Giulliano

erato690:
e isso mesmo nell!!

Giulliano obrigado pela sua resposta mas o problema fica no banco de dados do jeito que esta,
ele acaba atualizando tudo e a descricao do problema fica com o ultimo, se eu troca o methodo de atualizar para excluir funcional legal!!

so que o problema e que acaba apagando a chave primaria!!

mas vo dar uma pesquisada sobre a dica que voçe me deu nell obrigado e Giulliano .

Rapaz agora eu não entendi nada do que vc falou…rss

Em todo caso eu não acho que seu banco esteja com problemas, o fato é que vc deveria chamar o update cada vez que a descrição for diferente para um mesmo ID. Do jeito q vc fez vc só compara as descrições e aí lógfico q cada descrição é diferente uma da outra. O correto seria :

public HashMap<String, List><Problema>> checarProblemaBanco(HashMap<String, List><Problema>> hashProblemas) {    
            
        final List<Problema> problemasBase = this.daoProblema.consultar();  
        final List<Problema> problemas = new ArrayList<Problema>();    
  
        if (hashProblemas != null) {    
            Set<String> chaves = hashProblemas.keySet();    
            Iterator<String> iten = chaves.iterator();    
            while (iten.hasNext()) {    
                String chave = (String) iten.next();    
                problemas.addAll(hashProblemas.get(chave));    
            }    
  
            for(Problema t : problemas) {    
                for(Problema h :problemasBase){    
                    if( t.getId.equals (h.getId) && !t.getDescricao().equals(h.getDescricao())){    
                         update(t);
                    }    
                }    
            }    
        }    
        return null;  
    }
E

hahahaha

Calma ai vo tenta explicar!

esse arquivo properties é os erros do sistema onde um tecnico pode acresentar valores nele como tambem pode tirar.

o que eu quero fazer e pegar esse arquivo verificar se ele foi alterado se foi ele altera a tabela problema no banco de dados, se tiver algum valor novo
que nao tem no banco de dados ele salva no banco!

mas no meu Primeiro methodo eu so coloco a descriçao na classe e a adiciono a lista de Problema que vai na hash que sao os valores.

o que nao esto conseguindo e fazer essa checagem com a lista que ta no banco e com a lista que esta vindo do arquivo.

E

alguem sabe alguma solução, que possa me ajudar?

E

Pessoal consegui resolver eu apenas subescrevi os methodos hashCode e Equals, na minha classe Problema!

fico da seguinte forma.

public HashMap<String, List<Problema>> checarProblemaBanco(HashMap<String, List<Problema>> hashProblemas) {

        final List<Problema> problemasBase = this.daoProblema.consultar();
        final List<Problema> problemas = new ArrayList<Problema>();

        if (hashProblemas != null) {
            Set<String> chaves = hashProblemas.keySet();
            Iterator<String> iten = chaves.iterator();
            while (iten.hasNext()) {
                String chave = (String) iten.next();
                problemas.addAll(hashProblemas.get(chave));
            }

            for (Problema t : problemas) {
                for (Problema h : problemasBase) {
                    if (t.getDescricao().equals(h.getDescricao())) {

                        h.setDescricao(t.getDescricao());
                        h.setSuperTopico(t.getSuperTopico());
                        try {
                            this.daoProblema.atualizar(h);
                        } catch (Exception ex) {
                            Logger.getLogger(ProblemasArquivo.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    } else if(!problemasBase.contains(t)) {
                       t.getDescricao();
                       t.getSuperTopico();
                        try {
                            this.daoProblema.salvar(t);
                        } catch (Exception ex) {
                            Logger.getLogger(ProblemasArquivo.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }

                }
            }
        }

        return null;
    }

e a entidade com os methodos.

@Override
    public boolean equals(Object obj) {


        Problema problemaEquals = (Problema) obj;



        return (problemaEquals.getDescricao().equals(this.descricao));
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 71 * hash + (this.descricao != null ? this.descricao.hashCode() : 0);
        return hash;
    }
Criado 1 de setembro de 2010
Ultima resposta 2 de set. de 2010
Respostas 7
Participantes 3