Bom, estou aqui tentando fazer uma classe main
para testar algumas classes que fiz pra um trabalho de faculdade.
Estas classes simulam um buscador de URL’s em um banco de dados
que utiliza tabela hashMap.
Bom, vou postar aqui todas as classes e o que eu já construí da main pra eu poder explicar melhor o problema…
Classe VetorStrings
[code]package MiniGoogle;
import java.util.*;
/**
-
Implementa um array dinâmico de objetos da classe String, com capacidade variável de elementos.
-
/
public class VetorStrings {
/*- Implementa uma lista de objetos do tipo String.
- */
ArrayList vetor = new ArrayList();
/**
- Retorna o arrayList criado para armazenar as referencias.
*/
public ArrayList getVetor() {
return vetor;
}
/**
- Adiciona um elemento ao array.
- @param elemento Elemento a ser adicionado ao array. Os elementos são objetos da classe String.
- */
public void adiciona( String elemento ){
vetor.add( elemento );
}
/**
- Adiciona um elemento a determinado indice do array.
- @param elemento Elemento a ser adicionado ao array. Os elementos são objetos da classe String.
- @param indice Índice do array no qual o elemento (objeto da classe String) será inserido.
- */
public void adicionaEm( int indice, String elemento ){
vetor.add( indice, elemento );
}
/**
- Concatena os elementos de um objeto VetorStrings a outro objeto VetorStrings.
- @param vetor Objeto de VetorStrings que será adicionado a outro array.
- */
public void adicionaTodos( VetorStrings vetor ){
this.vetor.addAll(vetor.vetor);
}
/**
- Retorna o elemento( objeto da classe String ), em determinado índice.
- @param indice Indice referente à localização do elemento (objeto da classe String) no array.
- */
public String elementoEm( int indice ){
return this.vetor.get( indice );
}
/**
- Retorna true para VetorStrings vazio e false se houver um ou mais elementos no VetorStrings passado como argumento.
- */
public boolean estaVazio() {
return this.vetor.isEmpty();
}
/**
- Remove todos os elementos inseridos em um objeto de VetorStrings.
- @param vetor Objeto de VetorStrings que terá seus elementos removidos.
- */
public void removeTodos(VetorStrings vetor) {
this.vetor.removeAll(vetor.vetor);
} // testar
/**
- Retém todos os elementos contidos em um objeto VetorStrings que for passado como argumento, no VetorStrings que utilizar o
- método, apagando os elementos que não forem contidos nele.
- @param vetor Objeto de VetorStrings que terá seus elementos removidos.
- */
public void retemTodos(VetorStrings vetor) {
this.vetor.retainAll(vetor.vetor);
vetor = (VetorStrings)vetor;
}
/**
- Retorna o número de elementos contidos no VetorStrings.
- */
public int tamanho() {
return vetor.size();
}
/**
- Retorna uma representação em forma de String dos elementos contidos em um objeto de VetorStrings.
- */
public String toString() {
String string = “”;
for (String element : vetor) {
string += "- "+element;
}
return string;
}
}[/code]
Classe TabelaVetores
[code]package MiniGoogle;
import java.util.*;
/**
-
Implementa uma tabela de tamanho variável simulando uma tabela de chaves e
-
referências. Para cada chave ( String ), será mapeado um conjunto de referências
-
(VetorStrings).
-
@see VetorStrings
-
*/
public class TabelaVetores {/**
- Representação da tabela chave/referências (String/VetorStrings).
- */
public Map<String,VetorStrings> hashMap = new HashMap<String, VetorStrings>();
/**
- Adiciona uma determinado índice(chave/String) e uma determinada referência(VetorStrings),
- relacionando-os. Caso exista uma referência ligada ao indice a referência anterior será sobrescrita.
- @param indice Chave a qual a referência irá ser relacionada.
- @param vetor Objeto de VetorStrings que será utilizado como referência e será relacionado ao índice(chave/String);
- */
public void adiciona( String indice, VetorStrings vetor ){
hashMap.put( indice, vetor );
}
/**
- Retorna true caso índice(chave/String) exista na tabela, false caso não exista.
- @param indice Índice(chave/String) o qual deseja-se saber a existência ou não na tabela.
- */
public boolean existeIndice( String indice ){
boolean aux = false;
if(hashMap.containsKey( indice )){
aux = true;
}
return aux;
}
/**
- Retorna a referência(VetorStrings) a qual está relacionado o índice(chave/Strings).
- @param indice Índice(chave/String) o qual será retornado a referência(VetorStrings) relacionada.
-
/
public VetorStrings recupera( String indice ){
return hashMap.get(indice);
}
/* - Retorna um vetor de Strings contendo todos os índices armazenados na tabela.
-
/
public String[] indices(){
String s[] = new String[hashMap.size()];
Set keys = hashMap.keySet();
int i = 0;
for ( String key: keys){
s[i] = key;
i++;
}
return s;
}
/* - Remove a referência ligada a um índice(chave/String), retornando um booleano. Caso exista o índice, será retornado true e a
- referência será removida, caso não exista será retornado false.
- @param indice Índice(chave/String) o qual será removido a referência(VetorStrings) relacionada.
-
/
public boolean remove( String indice ){
if ( existeIndice(indice)){
hashMap.remove(indice);
return true;
}
else
return false;
}
/* - Retorna uma representação em forma de String da estrutura de HashMap.
- */
public String toString(){
return super.toString();
}
}[/code]
Classe BancoDeDadosMiniGoogle
[code]package MiniGoogle;
/**
- Classe que simula um banco de dados contendo palavras e páginas(URLs) nas quais estas palavras são
- utilizadas pelo programa Mini-Google para executar as pesquisas.
- @see TabelaVetores
- */
public class BancoDeDadosMiniGoogle {
TabelaVetores bd = new TabelaVetores();
/**
* Este método retorna true caso a plavara-chave exista no banco de dados e false caso a palavra-chave não exista.
* @param palavra Palavra a ser procurada no banco de dados.
* /
public boolean existePalavra( String palavra){
boolean aux = false;
if(bd.existeIndice( palavra )){
aux = true;
}
return aux;
}
/*
* Retorna um objeto do tipo VetorStrings, representando uma colecao de páginas(URLs) ligadas à palavra (chave) pesquisada.
* Caso a palavra não exista no banco de dados este método retorna null.
* @param palavra Palavra a qual o objeto VetorStrings está relacionado de acordo com o mapeamento do banco de dados.
* /
public VetorStrings getColecaoReferencias( String palavra ){
if ( existePalavra( palavra ) ){
return bd.recupera( palavra );
}
else return null;
}
/*
* Verifica se a palavra já existe no banco de dados. Se sim, a chave é recuperada e a referência
* passada por parâmetro é concatenada à coleção de referências já existentes naquela chave (palavra).
* Caso a palavra ainda não exista, ela e suas referências são adicionadas ao bando de dados.
* @param palavra Palavra a qual a referência estará ligada (chave).
* @param referencia Referência( URL, página ) que vai ser ligada a palavra (valores).
* */
public void putReferencia( String palavra, String referencia){
if (bd.existeIndice(palavra)){
VetorStrings vetor = bd.recupera(palavra);
vetor.adiciona(referencia);
bd.adiciona(palavra, vetor);
}else{
VetorStrings vetor = new VetorStrings();
vetor.adiciona(referencia);
bd.adiciona(palavra, vetor);
}
}
/**
* Verifica se a palavra já existe no banco de dados. Se sim, a chave é recuperada e o vetor de referências
* passado por parâmetro é concatenado à coleção de referências já existentes naquela chave (palavra).
* Caso a palavra ainda não exista, ela e suas referências são adicionadas ao bando de dados.
* @param palavra Palavra a qual a referência estará ligada.
* @param referencias Vetor de referência(s)( URLs, páginas ) que vão ser ligadas a palavra.
* */
public void putReferencias( String palavra, String[] referencias){
if (bd.existeIndice(palavra)){
if(bd.existeIndice(palavra)){
VetorStrings vetor = bd.recupera(palavra);
for(int i=0; i<referencias.length; i++){
vetor.adiciona(referencias[i]);
}
bd.adiciona(palavra, vetor);
}else{
VetorStrings vetor = new VetorStrings();
for(int i=0; i<referencias.length; i++){
vetor.adiciona(referencias[i]);
}
bd.adiciona(palavra, vetor);
}
}
}
}[/code]
Classe ParserPesquisa
[code]package MiniGoogle;
/**
- Implementa a execução da pesquisa, feita na classe BancoDeDadosMiniGoogle.
- A pesquisa poderá ocorrer utilizando as palavras AND e OR, por exemplo: “Mulher” AND
- “Homem”, “Mulher” OR “Homem”, retornando os resultados de acordo com a lógica dos conectivos booleanos.
- @see BancoDeDadosMiniGoogle
- */
public class ParserPesquisa {
/**
* Banco de dados no qual a classe ParserPesquisa irá procurar por referências( URL(s),
* páginas) através de palavras (Strings).
* */
BancoDeDadosMiniGoogle bd = new BancoDeDadosMiniGoogle();
/**
* Tipos VetorStrings que armazenarão as as referências de cada chave pesquisada.
*/
VetorStrings referencias1 = new VetorStrings();
VetorStrings referencias2 = new VetorStrings();
/**
* Tipo VetorString que armazenará o resultado final da pesquisa
*/
VetorStrings resultado = new VetorStrings();
/**
* Executa a pesquisa recebendo uma String e retornando um objeto de VetorStrings,
* contendo um conjunto de Strings ( URL(s), páginas ), representando a(s) página(s),
* URL(s) nas quais a(s) palavra(s) são contidas.
* */
public VetorStrings executarPesquisar(String pesquisa) {
int operador = 0;
/**
* Verificador booleando que verifica se a estrutura da pesquisa é compatível com
* a estrutura do aplicativo.
*/
boolean verificador = false;
String[] pesq = pesquisa.split(" "); //quebra a pesquisa em palavras e armazena em uma String[]
/**
* Conjunto de condições que veirificam se a estrutura da pesquisa
* está de forma correta.
*/
if(pesq.length == 3){
if(pesq[1].equals("e")){
operador = 1;
verificador = true;
}else{
if(pesq[1].equals("ou")){
operador = 2;
verificador = true;
}
else{
verificador = false;
}
}
/*Verifica a existencia no Banco de dados da palavra antes do operador lógico.
*Se true, coleta suas referencias.
*/
if(verificador){
String palavra1 = pesq[0];
if(bd.existePalavra(palavra1)){
referencias1 = bd.getColecaoReferencias(palavra1);
}else{
System.out.println("O bando de dados nao contem a chave " + palavra1 + ".");
referencias1 = null;
}
/*Verifica a existencia da palavra posterior ao operador lógico.
*Se true, coleta suas referencias.
*/
String palavra2 = pesq[2];
if(bd.existePalavra(palavra2)==true){
referencias2 = bd.getColecaoReferencias(palavra2);
}else{
System.out.println("O bando de dados nao contem a chave " + palavra2 + ".");
referencias2 = null;
}
/*Caso as duas palavras existam no banco de dados é feita a coleta das
* referencias em comum entre estas, conforme operador lógico AND.
*/
if(referencias1 != null && referencias2 != null){
for(int i=0; i<referencias1.tamanho(); i++){
for(int j=0; j<referencias2.tamanho(); j++){
if(operador == 1){
if(referencias1.elementoEm(i).equals(referencias2.elementoEm(j))){
resultado.adiciona(referencias1.elementoEm(i));
}
else{
resultado.adicionaTodos(referencias1);
resultado.adicionaTodos(referencias2);
}
}
}
}
if(resultado.tamanho() == 0){
System.out.println("\nNão foi encontrado nenhum resultado para a pesquisa.");
resultado = null;
}
}
}
else{
System.out.println("Estrutura de pesquisa incorreta.");
System.out.println("Utiliza a seguinte estrutura:");
System.out.println("palavra e/ou palavra");
}
}
return resultado;
}
}[/code]
Classe MiniGoogle
[code]package MiniGoogle;
public class AplicacaoMiniGoogle {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
BancoDeDadosMiniGoogle miniGoogle = new BancoDeDadosMiniGoogle();
ParserPesquisa pesquisa = new ParserPesquisa();
System.out.println("Inserindo algumas URL's automáticas no banco de dados...");
miniGoogle.putReferencia("Musica", "www.letras.mus.br");
miniGoogle.putReferencia("Videos", "www.youtube.com");
miniGoogle.putReferencia("Musica", "www.youtube.com");
miniGoogle.putReferencia("Humor", "www.humortadela.com.br");
miniGoogle.putReferencia("Musica", "www.cidadewebrock.com.br");
miniGoogle.putReferencia("Musica", "www.interativafm.net");
miniGoogle.putReferencia("Humor", "www.portaldohumor.com.br");
System.out.println("Executando uma pesquisa: ");
System.out.println("\nPesquisa:\tMusica e Videos");
System.out.println("Resultado da pesquisa: ");
pesquisa.executarPesquisar("Humor ou Musica");
}
}[/code]
Bom, o problema é que acho que está ocorrendo algum erro na inserção das chaves na tabela HashMap
ou algum erro na pesquisa da mesma, mais precisamente no método hashMap.containsKey();
Quando faço a pesquisa “Musica e Videos” a aplicação retorna como se não houvesse as chaves no banco de dados
(tabela hash).
Por favor, preciso muito que alguém mais experiente que eu em java dê uma olhada neste código e me ajude a encontrar
o provável erro.
Muito Obrigada…