Continuando com o tema anterior, mas mudando um pouco o foco, agora iremos ver como fazer uma pesquisa em uma lista, sem a necessidade de de criar um algorítimo para tal.
Vou apresentar-lhes a forma mais simples de pesquisa (e mais utilizada), em outros posts posso falar sobre as classes de pesquisa mais avançadas ou você mesmo pode procurá-las depois de possuir o conhecimento inicial.
Mapa e Árvore (HashMap e TreeMap).
Um mapa, na linguagem Java, consiste em literalmente um mapa de objetos, ou seja, você cria um mapa indicando onde seus objetos estão na lista, outro exemplo que podemos utilizar é o índice de um livro, que diz em que página está determinado asunto. Você irá fazer o mesmo, mas indicando em uma lista a posição de cada objeto:
O objeto XYZ está na posição 7 da lista.
Mas você não precisa fazer todo esse mapeamento sozinho, você precisa apenas mostrar o caminho e o java se vira com o mapeamento.
Depois que o mapa estiver pronto, você só precisa falar para o Java:
Ô rapaz, me da o objeto XYZ.
E você receberá o objeto xyz.
As classes HashMap e TreeMap no básico são identicas, funcionam da mesma forma, a diferença é que a árvore possui alguns métodos a mais, como identificar o primeiro ou o último item da lista, fazer submapas (tipo substring), enfim, tem algumas funções a mais, porém a pesquisa, para você, vai ser exatamente igual. Eu prefiro utilizar o HashMap porque ele costuma ser ligeiramente mais rápido.
Você precisará entender o concento de “chave/valor”, que é utilizado por todas essas classes de mapa, isso significa que cada objeto seu vai ter um identificador, um apelido, que você vai usar para “pedir” o objeto. Digamos que você tenha uma lista de um objeto do tipo Pessoa, essa classe, a classe Pessoa, possui os atributos nome, idade, cidade, cpf, profissão. Agora pense em como você usaria a frase “Me dá o objeto XXX”, para uma lista de Pessoa. Não dá né?
A única coisa que você pode fazer é pedir o objeto que está em determinada posição da lista, ou no nosso exemplo do livro, o texto que está na página 50. Dessa forma você precisaria saber o que existe em cada página ou ler todas as páginas para identificar o texto que você precisa.
Quando definimos um apelido para os objetos (e preparamos um mapa) a coisa fica mais fácil, mas devemos ter muito cuidado, vou repetir, devemos ter muito cuidado.
É necessário utilizar para apelido, algum valor que nunca, jamais, nem em um milhão de anos, se repetirá na lista, se por algum motivo você inserir algum objeto cujo “apelido” já exista na lista, o objeto antigo será eliminado e será considerado apenas o novo item. Isso vale para o HashMap e para o TreeMap.
Agora que você já entendeu o conceito de “chave/valor” ou seja, “apelido/objeto”, podemos criar o nosso mapa de Pessoa, mas precisamos escolher qual será o apelido de cada uma das Pessoas da lista. Tem que ser algo que não se repita. Que tal o CPF?
Criação do mapa:
Map<Long, Pessoa> mapa = new HashMap<Long, Pessoa>();
Para adicionar itens no mapa, utilizamos a função PUT, e passamos obviamente a chave (apelido) e depois o valor (objeto), vejamos alguns exemplos:
mapa.put(pessoa.getCpf(), pessoa);
mapa.put(11122233344, pessoa);
mapa.put(Long.parseLong("11122233344"), pessoa);
O preenchimento do mapa ficaria em algum loop, da mesma forma que você cria suas listas atuamente, se você está lendo as informações de um arquivo (txt), e a cada linha do arquivo é criado um objeto Pessoa, que seria adicionado à uma lista, mas no lugar da lista você adiciona o objeto em um mapa.
Agora vem a parte legal, sempre que você quiser fazer qualquer coisa com qualquer objeto da lista, você não precisa mais ficar percorrendo a lista e verificando se o objeto atual é o que você precisa, agora que estamos trabalhando com mapa, você pode simplesmente trabalhar com o apelido do objeto que você precisa!
mapa.get(11122233344);
caso queira eliminar o objeto da lista
mapa.remove(11122233344);
Lembre-se apenas que o apelido informado deve ser exatamente igual ao apelido que existe na lista, caso contrário poderá ser exibido um erro.
Para evitarmos qualquer tipo de erro, como por exemplo o apelido não existir na lista, podemos utilizar a função containsKey(). Esse método presente em praticamente todas as classes de mapa, retorna um booleano, informando se o apelido existe ou não na lista, dessa forma conseguimos controlar e evitar erros.
if (mapa.containsKey(11122233344)) {
pessoaSelecionada = mapa.get(11122233344);
}
if (mapa.containsKey(11122233344)) {
mapa.remove(11122233344);
}
Facil?
O apelido dos seus objetos pode ser de qualquer tipo, desde que não seja um tipo primitivo. Você pode utilizar como apelido um Integer, Long, Double, até String. Só lembre-se de que os apelidos que você escolher não podem se repetir, ou você terá uma lista inconsistente.
Se quiser trabalhar com TreeMap, a utilização é identica, você só precisa mudar a declaração da variável para algo como:
TreeMap<Long, Pessoa> tree = new TreeMap<Long,Pessoa>();
O TreeMap possui métodos a mais que podem te ajudar de alguma forma, mas a inserção, pesquisa e remoção de conteúdo é identica ao HashMap, não fazendo diferença utilizar um ou outro para listas/funções mais simples.