Duvida para fazer um filtro

5 respostas
AlanLojudice

E aee pessoal blz?

Eu to com um problema aqui, na hora de fazer um filtro para uma listagem.

O filtro é mais ou menos isso.

if (parameter.equals("aberta")) { statusParaComparar = Ocorrencia.COMPLETA; } if (parameter.equals("fechada")) { statusParaComparar = Ocorrencia.FECHADA ; } if (parameter.equals("emAtendimento")) { statusParaComparar = Ocorrencia.EMATENDIMENTO; } if (parameter.equals("")) { statusParaComparar = ocorrencia.getStatus(); }

Esse filtro funcionava normalmente. Mas agora surgiu um problema, pq quando ele for igual a fechada ele nao vai mostrar somente as ocorrencias q tem seu status como FECHADA e tbm CANCELADA e DUPLICADA. Mas se eu colocar assim dentro do if

if (parameter.equals("fechada")) { statusParaComparar = Ocorrencia.FECHADA ; statusParaComparar = Ocorrencia.CANCELADA; statusParaComparar = Ocorrencia.DUPLICADA ; }

Ele vai pegar apenas as que estao DUPLICADA pois eh a ultima linha. Alguem sabe uma maneira pra eu fazer esse filtro de maneira correta? No caso de ser fechada, mostrar tds as ocorrencias q possuem esses 3 status.

Desde ja agradeco.

5 Respostas

brunogamacatao

Você tem duas alternativas, ou faz com que o atributo statusParaComparar seja uma coleção de valores, daí você pode sair fazendo add de parâmetros e depois verificar se um determinado parâmetro consta na coleção. Uma outra saída seria você usar os operadores bit a bit (como por exemplo você faz para checar se a tecla control ou shift estão pressionadas quando implementa um KeyListener). Ex:

int STATUS_1 = 0x1;
		int STATUS_2 = 0x1 << 1;
		int STATUS_3 = 0x1 << 2;
		int STATUS_4 = 0x1 << 3;
		
		int status = STATUS_1 | STATUS_3;
		
		if ((status & STATUS_1) == STATUS_1)
			System.out.println("status 1");
		if ((status & STATUS_2) == STATUS_2)
			System.out.println("status 2");
		if ((status & STATUS_3) == STATUS_3)
			System.out.println("status 3");
		if ((status & STATUS_4) == STATUS_4)
			System.out.println("status 4");

A idéia por trás dessa implementação é que um inteiro possui 4 bytes, ou seja, 32 bits, porém, você pode usar cada um desses bits para sinalizar um estado diferente. Inclusive, você pode usar o mesmo inteiro para representar vários estados (até 32) simultâneamente. Para isto, basta utilizar algumas operações bit a bit. Caso você precise de mais constantes combinadas você pude usar um long, que possui 64 bits.

AlanLojudice

Nossa senhora…rs Não tem uma maneira mais simples não?rs
Pensei que podia ser alguma coisa de sintaxe soh…

Ataxexe

Você pode mudar a variável statusParaComparar para um array ou vetor caso não queira usar a solução do brunogamacatao, que é uma solução muito bacana e passível de ser generalizada (se usada com BigInteger você pode expandir mais ainda a gama de valores).

AlanLojudice

Nossa to meio perdido de como fazer isso com o array.
Teria como alguem me dar uma ajuda nisso...
O metodo eh esse aqui.

public ActionForward filtraPorStatuseAreaAtuacao(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception, PrincipiaException {

		// ----------------
		request.setAttribute("listaDeAreasDeAtuacao", carregarListaDeAreasDeAtuacao());
		List listaOcorrencias = AtendimentoFacadeImpl.getInstance().getListaOcorrencias();
		ListarTodasOcorrenciasForm formReal = (ListarTodasOcorrenciasForm) form;

		List novaListaFiltrada = new ArrayList();
		for (int i = 0; i < listaOcorrencias.size(); i++) {
			Ocorrencia ocorrencia = (Ocorrencia) listaOcorrencias.get(i);
			String area = request.getParameter("oidAreaDeAtuacao");
			String oidAreaDeAtuacaoDaOcorrencia = getOidDaAreaDeAtuacaoSelecionada(ocorrencia);
			if (area.equals("")) {
				oidAreaDeAtuacaoDaOcorrencia = "";
			}
			String parameter = request.getParameter("status");
			int statusParaComparar = 0; // = parameter.equals("aberto") ? Ocorrencia.COMPLETA : Ocorrencia.FECHADA;

			if (parameter.equals("aberta")) {
				statusParaComparar = Ocorrencia.COMPLETA;
			}
			if (parameter.equals("fechada")) {
				statusParaComparar = Ocorrencia.FECHADA ;
			}	
			if (parameter.equals("emAtendimento")) {
				statusParaComparar = Ocorrencia.EMATENDIMENTO;				
			}
			if (parameter.equals("")) {
				statusParaComparar = ocorrencia.getStatus();
			}

			if (ocorrencia.getStatus() == statusParaComparar && oidAreaDeAtuacaoDaOcorrencia.equals(formReal.getOidAreaDeAtuacao())) {
				novaListaFiltrada.add(ocorrencia);
			}
		}

		request.getSession().setAttribute("listaOcorrencias", criarListaDeOcorrenciaOrdenada(novaListaFiltrada));

		// ----------------
		return mapping.findForward("mesmaPagina");
	}

Esses status da ocorrencia eu venho buscando de outra classe...ai por isso meio q me perdi...
Se alguem poder me ajudar como fazer com array agradeco..

valeu

brunogamacatao

Monta na tua página o parâmetro status como um String com os n estados que ele possa ter separados por vírgula (não sei como esse parâmetro é construído na página).

Daí você pode criar um pequeno método para verificar se há uma ocorrência de um string dentro do string de status. Ex:

private boolean contem(String status, String parametro) {
    return status.indexOf(parametro) >= 0;
}

Para usar é só fazer:

if (contem(status, "aberto")) {
...
}

if (contem(status, "fechado")) {
...
}

E por aí vai.

Criado 18 de outubro de 2007
Ultima resposta 18 de out. de 2007
Respostas 5
Participantes 3