Hey pessoal.
Eu estou a implementar uma aplicação do género de um grafo em Java.
A aplicação consiste na criação de companhias aéreas e respectivos percursos.
Por exemplo existem os seguintes comandos:
company:nomeDaCompanhia:velocidade -> cria um objecto do tipo companhia, atributos 2 parametros seguintes.
insert:nomeDaCompanhiarigem:destino:distancia -> se ainda não existir este percurso (e notar que as distancias teem de ser diferentes para origens e destinos iguais) insere-o
remove:nomeDaCompanhiarigem:destino -> se existir a companhia e a origem, remove o percurso
etc.
Para inserir percursos, eu tenho uma Hashtable que guarda objectos do tipo Companhia (key -> nome da companhia). Tenho outra Hashtable que guarda objectos do tipo Origem (key -> nome da cidade origem). Ao inserir percursos, vejo se ainda não existir essa origem na Hashtable, crio um objecto do tipo Destino e ligo a Origem ao destino. Ou seja a partir daqui são listas ligadas ordenadas alfabeticamente, ou seja, se inserirmos para a companhia TAP os seguintes percursos: Porto->Faro, Porto->Lisboa, Porto->Coimbra, ficaria na seguinte ordem
PORTO -> COIMBRA -> FARO -> LISBOA
Até aqui tudo bem...é de notar que podemos criar mais objectos do tipo Origem na Hashtable. Por exemplo, se inserirmos mais percursos...
PORTO -> COIMBRA -> FARO -> LISBOA
COIMBRA -> FARO -> LISBOA
FARO -> LISBOA -> PARIS
LISBOA -> FARO -> MADRID
MADRID -> PARIS
Agora estou a implementar um comando do tipo printByNumber, que percorre a partir duma origem várias cidades até encontrar a cidade destino passada como parametro (assim como a cidade origem). Se não encontrar o destino nunca, não imprime nada! Se encontrar, pode encontrá-lo de várias maneiras e podem ser necessários vários vôos. E aí tenho de no final ir comparando, se o numero de voos for maior que o percurso anterior, fica com o percurso anterior e imprime esse, pela ordem das cidades que passou. Se for menor, continua a procurar. Se não encontrar mais, imprime o último que encontrou, por ai em diante.
Exemplo do comando -> printByNumberrigem:destino
origem = porto, destino = paris
possibilidades: Porto->Faro->Paris
Porto->Lisboa->Madrid->Paris
Ficando a primeira opção, uma vez, que se realizam menor número de voos do Porto para Paris.
O problema está...como implemento isto? Percorrer todas as possibilidades? Já consegui este pedaço de código, mas qualquer coisa está mal, pois o percurso de Faro a Paris não é guardado :S
Alguma ajuda?
Ou alguma maneira mais fácil e menos confusa?
Obrigado ;-)
Eu estou a implementar uma aplicação do género de um grafo em Java.
A aplicação consiste na criação de companhias aéreas e respectivos percursos.
Por exemplo existem os seguintes comandos:
company:nomeDaCompanhia:velocidade -> cria um objecto do tipo companhia, atributos 2 parametros seguintes.
insert:nomeDaCompanhiarigem:destino:distancia -> se ainda não existir este percurso (e notar que as distancias teem de ser diferentes para origens e destinos iguais) insere-o
remove:nomeDaCompanhiarigem:destino -> se existir a companhia e a origem, remove o percurso
etc.
Para inserir percursos, eu tenho uma Hashtable que guarda objectos do tipo Companhia (key -> nome da companhia). Tenho outra Hashtable que guarda objectos do tipo Origem (key -> nome da cidade origem). Ao inserir percursos, vejo se ainda não existir essa origem na Hashtable, crio um objecto do tipo Destino e ligo a Origem ao destino. Ou seja a partir daqui são listas ligadas ordenadas alfabeticamente, ou seja, se inserirmos para a companhia TAP os seguintes percursos: Porto->Faro, Porto->Lisboa, Porto->Coimbra, ficaria na seguinte ordem
PORTO -> COIMBRA -> FARO -> LISBOA
Até aqui tudo bem...é de notar que podemos criar mais objectos do tipo Origem na Hashtable. Por exemplo, se inserirmos mais percursos...
PORTO -> COIMBRA -> FARO -> LISBOA
COIMBRA -> FARO -> LISBOA
FARO -> LISBOA -> PARIS
LISBOA -> FARO -> MADRID
MADRID -> PARIS
Agora estou a implementar um comando do tipo printByNumber, que percorre a partir duma origem várias cidades até encontrar a cidade destino passada como parametro (assim como a cidade origem). Se não encontrar o destino nunca, não imprime nada! Se encontrar, pode encontrá-lo de várias maneiras e podem ser necessários vários vôos. E aí tenho de no final ir comparando, se o numero de voos for maior que o percurso anterior, fica com o percurso anterior e imprime esse, pela ordem das cidades que passou. Se for menor, continua a procurar. Se não encontrar mais, imprime o último que encontrou, por ai em diante.
Exemplo do comando -> printByNumberrigem:destino
origem = porto, destino = paris
possibilidades: Porto->Faro->Paris
Porto->Lisboa->Madrid->Paris
Ficando a primeira opção, uma vez, que se realizam menor número de voos do Porto para Paris.
O problema está...como implemento isto? Percorrer todas as possibilidades? Já consegui este pedaço de código, mas qualquer coisa está mal, pois o percurso de Faro a Paris não é guardado :S
Alguma ajuda?
if(origens.containsKey(comandos[1].trim())){ //se a origem existir
Origem origem1 = ((Origem)origens.get(comandos[1].trim()));
Destino auxiliarP = origem1.primeiro;
//Destino aux = auxiliarP;
boolean existe = false;
boolean encontrou = false;
String outputActual = "";
String outputAnterior = outputActual;
int numVoosActual = 0;
int numVoosAnterior = numVoosActual;
//while(aux != null){
if(existeDestino(origem1, comandos[2].trim())){ //ve se é voo directo
numVoosActual++;
existe = true;
}else{ //se não for, entra num ciclo que vai da origem ate ao destino
while(auxiliarP != null){
if(origens.containsKey(auxiliarP.cidade)){ //se a origem existir
//System.out.println("Existem destinos a partir de " + auxiliarP.cidade);
Origem origem2 = ((Origem)origens.get(auxiliarP.cidade));
Destino auxiliarS = origem2.primeiro;
numVoosActual++;
outputActual = outputActual.concat(":" + auxiliarP.cidade);
if(existeDestino(origem2, comandos[2].trim())){
//System.out.println("Existem o percurso: " + auxiliarP.cidade + "-" + auxiliarS.cidade);
numVoosActual++;
existe = true;
break;
}else{
while(auxiliarS != null){
if(origens.containsKey(auxiliarS.cidade)){ //se a origem existir
numVoosActual++;
//System.out.println("Existem destinos a partir de " + auxiliarS.cidade);
Origem origem3 = ((Origem)origens.get(auxiliarS.cidade));
Destino auxiliarT = origem3.primeiro; //pode-se tirar
if(existeDestino(origem3, comandos[2].trim())){
//System.out.println("Existe percurso: " + auxiliarS.cidade + "-" + auxiliarT.cidade);
outputActual = outputActual.concat(":" + auxiliarS.cidade);
numVoosActual++;
existe = false;
if(auxiliarT.cidade.equals(comandos[2].trim())){
if(numVoosActual > numVoosAnterior){ //se o numero de voos actual for maior que o numero de voos calculado anteriormente sai do ciclo e escreve o que tem
encontrou = true;
System.out.print("printByNumber:" + comandos[1].trim() + outputActual + ":" + comandos[2].trim() + ":" + numVoosActual);
System.out.println();
}else{
numVoosActual = numVoosAnterior;
outputActual = outputAnterior;
}
}
}
}
auxiliarS = auxiliarS.proximo;
}
}
}
if(encontrou){
break;
}
else{
auxiliarP = auxiliarP.proximo;
System.out.println("PASSA PARA O PROXIMO DESTINO!");
numVoosAnterior = numVoosActual;
System.out.println("-" + numVoosAnterior + "-" + numVoosActual);
outputAnterior = outputActual;
numVoosActual = 0;
outputActual = "";
}
}
}
if(existe){
System.out.print("printByNumber:" + comandos[1].trim() + outputActual + ":" + comandos[2].trim() + ":" + numVoosActual);
System.out.println();
}
else{
System.out.print("printByNumber");
System.out.println();
}
//aux = aux.proximo;
//}
}
Ou alguma maneira mais fácil e menos confusa?
Obrigado ;-)