[RESOLVIDO] fazer buscar em um Map (como no uso do operador LIKE '%tav%')

Bom dia galera…

Estou querendo fazer uma busca de informações em um Map, a busca por chave tá ok:

System.out.println(mapAlunos.containsKey("003"));

mas meu Map tem esse formato:

Map<String, AlunoTO> mapAlunos

como meu segundo parametro é uma classe bean não consigo buscar entre os dados usando o containsValue(“xx”):

System.out.println(mapAlunos.containsValue("002")); System.out.println(mapAlunos.containsValue("Aluno 02")); System.out.println(mapAlunos.containsValue("Curso teste 02"));

alguma sujestão de como posso fazer isso?

abaixo a forma que inicializei meu Map:

[code]Map<String, AlunoTO> alunos = new HashMap<String, AlunoTO>(); //inicializa alguns valores

	SimpleDateFormat formataData = new SimpleDateFormat("dd/MM/yyyy");	
	//System.out.println("contextInitialized");
	try {		
		Date data = formataData.parse("21/12/2012");			
		alunos.put("001", new AlunoTO("001", "Aluno 01", "Curso teste 01",data));		
		Date data2 = formataData.parse("20/12/2012");			
		alunos.put("002", new AlunoTO("002", "Aluno 02", "Curso teste 02",data2));	
		Date data3 = formataData.parse("20/12/2012");			
		alunos.put("003", new AlunoTO("003", "Aluno 03", "Curso teste 03",data3));	
		contextEvent.getServletContext().setAttribute("alunos", alunos);

	} catch (ParseException e) {			
		e.printStackTrace();
	}				

}[/code]

e aqui a forma q o chamo de volta para ser usado em meu Servlet (onde quero fazer a busca):

Map<String, AlunoTO> mapAlunos = (Map<String, AlunoTO>)request.getSession().getServletContext().getAttribute("alunos"); HttpSession session = request.getSession(); session.setAttribute("mapAlunos", mapAlunos);

algo do tipo:

for(String chave: map.keySet()) {
AlunoTO a = map.get(chave);
if(a.getNome().equals("algumacoisa")) {
return a;
}
}

resolve?

Estranho, normalmente a ideia é colocar na chave algo que você vá usar pra identificar o valor.

Se coloca o código (“001”), deveria buscar por isso.

Agora se quiser poder buscar por todos os atributos, pode fazer métodos específicos pra isso, como o kleber sugeriu

O containsKey é limitado a teste de igualdade.

Você tem que criar um método parecido com o like do banco de dados para a partir de uma chave de pesquisa varrer os keys de seu map e através de expressão regular, testar se a chave de pesquisa está contida na key da vez durante a iteração.

Você está fazendo um cache de um banco de dados, por isso, se preocupe em relação a atualização dele para fazer um bloqueio para as pesquisas não sofrerem impacto.

Também verifica se este cache não corre o risco de ser redundado na memória de seu programa, senão o webcontainer passa a apresentar lentidão.

O melhor padrão para isso é o sigleton.

wiliamps

Vamos por partes.
Primeiro que em um banco de dados você não possui estruturas complexas (tá, nos bancos de dados OO tem), ou é texto, ou é tipo primitivo ou data.
Sendo assim, é conveniente buscar por coringas. Ou seja, eu quero tudo que tenha “ABC” no nome é muito simples de buscar. Certos bancos até permitem buscar esse trecho de varchar em todas as colunas ao mesmo tempo.
Agora, pense em termos OO. Você teria que transformar tudo em texto (String) e, então, com o contains, verificar se este trecho existe naquela determinada String.
Além disso, precisa percorrer a lista. Tudo bem, um iterator faz isso por você. Mas, qual o custo disso (O de que?)? Penso que existem outras (e melhores) formas de implementar o que você está tentando criar. Lembre-se, um banco de dados é baseado em uma estrutura de árvore binária de busca (muito) aprimorada. Isso permite indexação, que torna as consultas mais dinâmicas.

primeiramente gostaria de agradecer pela ajuda

fiz como sugerido acima mas as busca são retornadas somente quando coloco a frase completa no .equals(“exemplo”). alguma sugestão de como fazer para buscar por exemplo: “Aluno 03” acrescentando como argumento somente o “03”?

pesquisei nos metodos da classe object mas não encontrei algo q se enquadre no que preciso. vou ver se consigo algo como o subString

[quote=fabiomariner]primeiramente gostaria de agradecer pela ajuda

fiz como sugerido acima mas as busca são retornadas somente quando coloco a frase completa no .equals(“exemplo”). alguma sugestão de como fazer para buscar por exemplo: “Aluno 03” acrescentando como argumento somente o “03”?

pesquisei nos metodos da classe object mas não encontrei algo q se enquadre no que preciso. vou ver se consigo algo como o subString

[/quote]

se você fosse um pouco mais claro, acho q daria pra te ajudar…

vc quer buscar pela chave e pelo valor do Map ?

[quote=fabiomariner]primeiramente gostaria de agradecer pela ajuda

fiz como sugerido acima mas as busca são retornadas somente quando coloco a frase completa no .equals(“exemplo”). alguma sugestão de como fazer para buscar por exemplo: “Aluno 03” acrescentando como argumento somente o “03”?

pesquisei nos metodos da classe object mas não encontrei algo q se enquadre no que preciso. vou ver se consigo algo como o subString

[/quote]
O .equals exige que o objeto seja exatamente igual ao que se está buscando.
Na classe String, temos o método contains…

É por isso que o pessoal se encanta com o LINQ ( http://msdn.microsoft.com/en-us/library/bb308959.aspx ).
Ele resolve esse problema do programador mas não o questiona sobre se isso é realmente uma boa solução para ele.
Por isso, volta e meia a gente é chamado para resolver problemas de desempenho oriundos de más aplicações do LINQ.

[quote=entanglement]É por isso que o pessoal se encanta com o LINQ ( http://msdn.microsoft.com/en-us/library/bb308959.aspx ).
Ele resolve esse problema do programador mas não o questiona sobre se isso é realmente uma boa solução para ele.
Por isso, volta e meia a gente é chamado para resolver problemas de desempenho oriundos de más aplicações do LINQ. [/quote]

???

quero fazer a busca pelo valor do map

[code] Map<String, AlunoTO> mapAlunos = (Map<String, AlunoTO>) request.getSession().getServletContext().getAttribute(“alunos”);
HttpSession session = request.getSession();
session.setAttribute(“mapAlunos”, mapAlunos);

	for (String chave : mapAlunos.keySet()) {
		AlunoTO a = mapAlunos.get(chave);
		System.out.println(" .> "+a.getNome());
		if(a.getNome().equals("Aluno 03")) //aqui onde quero buscar um valor passando apenas parte dele
			System.out.println("0000000"); // temporário, só pra teste
		
	}[/code]

vou ver esse método contains e esse LINQ q foi indicado

[quote=fabiomariner]quero fazer a busca pelo valor do map

[code] Map<String, AlunoTO> mapAlunos = (Map<String, AlunoTO>) request.getSession().getServletContext().getAttribute(“alunos”);
HttpSession session = request.getSession();
session.setAttribute(“mapAlunos”, mapAlunos);

	for (String chave : mapAlunos.keySet()) {
		AlunoTO a = mapAlunos.get(chave);
		System.out.println(" .> "+a.getNome());
		if(a.getNome().equals("Aluno 03")) //aqui onde quero buscar um valor passando apenas parte dele
			System.out.println("0000000"); // temporário, só pra teste
		
	}[/code]

vou ver esse método contains e esse LINQ q foi indicado[/quote]

então faz assim

if(a.getNome().toLowerCase().contains("aluno 03")) 

com essa solução mato 2 coelhos com uma cajadada só (.toLowerCase().contains()). funcionou perfeitamente, deu até vontade de chorar de emoção : )

Obrigado de verdade a todos.