HashMap?

8 respostas
L

Eae Pessoal,

É o seguinte…
Esta é uma imagem de uma consulta SQL

Como podem observar os dados nao estao certinhos para simplemente botar na tela, tenho de trabalhar com eles, por exemplo na alternativa 101, teve apenas 1 respondente no Polo ‘SC016’ e nenhum dos outros respondeu essa alternativa nos outros Polos. Teria de estar como zero, mas eu nem posso usar o comando isNull no sql para tentar “zerar campos”, pois se a questao não foi respondida nem sequer existe uma entrada com o campo null.

Ou seja, tenho uma tríade. Sendo que cada Polo + Alternativa me da um numero de respondentes.
Estou pensando em fazer algum tipo de HashMap onde a chave seria Polo + Alternativa, mas não estou conseguindo.

Alguém tem idéia de como posso fazer isso? Ou se estou indo no caminho certo…

Muito Obrigado

8 Respostas

rmendes08

Na verdade, eu não entendi muito bem o seu problema. Pra saber se uma entrada Polo + alternativa não tem respondentes você faz a consulta, se não vir nenhuma linha então o número de respondentes é zero. Outra opção é sempre que você cadastrar uma chave Polo + alternativa já incluir uma entrada na tabela com o valor 0 para número de respondentes. Agora, se você realmente precisa colocar em um HashMap é só usar uma string no formato
polo + “:” + alternativa como chave, e o número de respondentes no valor.

L

Obrigado pela resposta rmends08,

Para melhorar o desempenho, eu montei essa consulta que já retorna tudo que preciso, não posso fazer uma consulta sql por cada caso Polo + alternativa.

Não entendi quando disse “chave”, já está falando de HashMap? Qual tabela você diz?
Minha idéia era poder pegar tudo que preciso da consulta SQL, se não existirem respondentes nesse caso, não retornaria linhas, e eu teria de popular os HashMaps com Polo+alternativa pegando eles de outros lugares certo?

rmendes08:
Agora, se você realmente precisa colocar em um HashMap é só usar uma string no formato
polo + “:” + alternativa como chave, e o número de respondentes no valor.

Concaternar Strings, nao tinha pensando nisso. Bom.

Com uma consulta SQL, é possível preencher essas linhas faltantes como “zero”. Ou seja quando não houver nRespondentes(count), mostrar 0. O Banco é Sybase.

Obrigado mais uma vez

rmendes08

Cara, faz o seguinte, posta as tabelas que você está usando e qual é o problema fundamental. E outra, você realmente esperar obter melhor desempenho trazendo toda uma massa de dados do banco e processando essa massa na aplicação ?

L

Vou postar um dos casos,
A imagem da consulta SQL é a mesma, não será muito maior que aquilo. Aquela é um exemplo com 3 pólos. O máximo são 10, não são tantos dados para trazer do banco.
O método é este

public static ArrayList<AlternativaQuestao> getAlternativa(
			Dimensao dimensao, GrupoQuestao grupoQuestao, Questao questao,
			Pesquisa pesquisa) {

		// Pega as descrições das alternativas das questões
		String sql = "select b.nu_alternativa_tpa, a.nu_seqAlternativa_que, b.dc_alternativa_tpa "
				+ "from capa..vi_alternativaQuestao_que a, "
				+ "capa..vi_tipoAlternativa_tpa b where a.cd_pesquisa_pes=? "
				+ "and a.cd_pesquisa_pes=b.cd_pesquisa_pes "
				+ "and cd_dimensao_dim=? "
				+ "and cd_grupoQuestao_grq=? "
				+ "and cd_questao_qto=? "
				+ "and a.nu_alternativa_tpa = b.nu_alternativa_tpa "
				+ "order by a.nu_seqAlternativa_que";

		Connection con = null;
		ArrayList<AlternativaQuestao> lista = new ArrayList<AlternativaQuestao>();

		try {
			int c = 1;
			con = DBUtils.getConnectionFromPool();

			PreparedStatement stm = con.prepareStatement(sql);
			stm.setInt(c++, pesquisa.getIdPesquisa());
			stm.setInt(c++, dimensao.getCdDimensao());
			stm.setInt(c++, grupoQuestao.getGrupo());
			stm.setInt(c++, questao.getNumQuestao());
			ResultSet rs = stm.executeQuery();

			AlternativaQuestao alt;

			while (rs.next()) {
				alt = new AlternativaQuestao();
				alt.setNumero(rs.getInt("nu_alternativa_tpa"));
				alt.setDescricao(rs.getString("dc_alternativa_tpa"));
				alt.setSequencia(rs.getInt("nu_seqAlternativa_que"));
			}

			// Consulta que retorna os respondentes por alternativa e polo (IMAGEM DO PRIMEIRO POST)
                       String sql2 = "select distinct cd_polo_pol, count(*) as nRespondentes, nu_alternativa_tpa "
					+ "from capa..respostaQuestaoAcad_rqa "
					+ "where cd_pesquisa_pes=? "
					+ "and nu_sem_trm=? "
					+ "and cd_dimensao_dim=? and cd_grupoQuestao_grq=? and cd_questao_qto=? "
					+ "and cd_curso_rqa=? and cd_disciplina_dis=? "
					+ "and nu_alternativa_tpa In(select nu_alternativa_tpa " +
							"from capa..vi_alternativaQuestao_que  " +
							"where cd_pesquisa_pes=? and cd_dimensao_dim=? " +
							"and cd_grupoQuestao_grq=? " +
							"and cd_questao_qto=? ) " 
					+ "group by cd_polo_pol, nu_alternativa_tpa";
			
			int c2 = 1;
			PreparedStatement stm2 = con.prepareStatement(sql2);
			stm2.setInt(c2++, pesquisa.getIdPesquisa());
			stm2.setInt(c2++, pesquisa.getSemestre());
			stm2.setInt(c2++, dimensao.getCdDimensao());
			stm2.setInt(c2++, grupoQuestao.getGrupo());
			stm2.setInt(c2++, questao.getNumQuestao());
			stm2.setInt(c2++, DBData.cur.getCodCurso());
			stm2.setString(c2++, DBData.dis.getCodigo());
			stm2.setInt(c2++, pesquisa.getIdPesquisa());
			stm2.setInt(c2++, dimensao.getCdDimensao());
			stm2.setInt(c2++, grupoQuestao.getGrupo());
			stm2.setInt(c2++, questao.getNumQuestao());
			
			ResultSet rs2 = stm2.executeQuery();

                        while (rs2.next()) {...
                        }

                       // Agora preciso pegar essas linhas em rs2. Sendo que para cada Pólo + Alternativa eu tenha uma qtde de respondentes. 

                      // Adiciona as alternativas para serem retornadas em uma lista
  lista.add(alt);
return lista;
Minha idéia é montar um SQL que tenha a melhor fonte de informação(não em tamanho), mas de uma maneira fácil para ser trabalhada pela aplicação. Segue a imagem abaixo de como são as alternativas. Um método que pega a Questão chama esse método que retorne em uma lista de Alternativas, as alternativas para cada Questão.

Um exemplo da tabela (JSF-richfaces)
[IMG]http://img140.imageshack.us/img140/8964/devmedia.th.gif[/IMG]

Eu tenho de trabalhar com esses dados na aplicação sim. Não vejo outra maneira. Ou montar um SQL onde o count() é usado para setar 0, se não encontrar uma entrada polo+alternativa(não sei como fazer isso na consulta sql).

Muito Obrigado mesmo.

rmendes08

Cara, ler SQL sem conhecer as tabelas é impossível …

L

É uma tabela única de respostas. Todos os campos estão nela.

from capa..respostaQuestaoAcad_rqa
rmendes08

Cara, já entendi o que tá acontecendo. Na primeira consulta você obtém as descrições das alternativas pra somente então fazer a contagem. E isso não vai dar certo mesmo. E eu vou insistir na pergunta, é uma única tabela mesmo ? Porque se for, o que você realmente precisa é normalizar esse modelo … todo o resto é POG

L

rmendes08:
Cara, já entendi o que tá acontecendo. Na primeira consulta você obtém as descrições das alternativas pra somente então fazer a contagem. E isso não vai dar certo mesmo.

Essa parte é de outra tabela, mas isso não vem ao caso. Ele só pega as descricoes.

rmendes08:

E eu vou insistir na pergunta, é uma única tabela mesmo ? Porque se for, o que você realmente precisa é normalizar esse modelo … todo o resto é POG

As respostas, para se contar o N, são contadas como entradas nessa única tabela. Eu só tenho acesso a consultas nesse BD, então vou usar esta tabela.

Agora, fica minha dúvida para sua sugestão em relação a como pegar essa tríade, polo+alternativa -> nRespondentes

Grato

Criado 24 de julho de 2009
Ultima resposta 26 de jul. de 2009
Respostas 8
Participantes 2