Fórum Criar, Editar e Remover determinado item de um ArrayList #497767
14/10/2014
0
public ArrayList<Integer> buscaMenorCaminho()
{
ArrayList<Integer> buscaMenorCaminhoAL = new ArrayList<Integer>();
int menor = distancia;
int PontoA, PontoB, pontoDistanciaAB;
buscaMenorCaminhoAL.add(null);
buscaMenorCaminhoAL.add(null);
buscaMenorCaminhoAL.add(null);
buscaMenorCaminhoAL.add(null);
for (int i = 0; i < this.menorCaminhoAL().size(); i++)
{
pontoA = this.menorCaminhoAL().get(i);
pontoB = this.menorCaminhoAL().get(i+1);
pontoDistanciaAB = this.menorCaminhoAL().get(i+2);
ArrayList<Integer> buscaDistancia = this.buscaDistancia(pontoB, this.pontoA);
int a = buscaDistancia.get(0);
int b = buscaDistancia.get(1);
int c = buscaDistancia.get(2);
if( pontoDistanciaAB + c < menor )
{
if(buscaMenorCaminhoAL.size() == 2)
{
buscaMenorCaminhoAL.add(null);
buscaMenorCaminhoAL.add(null);
}
menor = pontoDistanciaAB + c;
buscaMenorCaminhoAL.set(0, pontoA);
buscaMenorCaminhoAL.set(1, pontoB);
buscaMenorCaminhoAL.set(2, a);
buscaMenorCaminhoAL.set(3, b);
}
else
{
buscaMenorCaminhoAL.set(0, this.pontoA);
buscaMenorCaminhoAL.set(1, this.pontoB);
if (buscaMenorCaminhoAL.size() > 2)
{
buscaMenorCaminhoAL.remove(2);
buscaMenorCaminhoAL.remove(3);
}
}
i = i + 2;
}
return buscaMenorCaminhoAL;
}
A ideia aqui é se pontoDistanciaAB + c for menor que a variável menor, eu preciso set (configurar) o valor dos índices 0, 1, 2 e 3 do ArrayList . Porem, esses índices ainda não foram criados.
E se pontoDistanciaAB + c for maior ou igual a varável a, preciso set apenas os índices 0 e 1. E no caso remover os índices 3 e 4.
Isso em uma volta do loop.
Para a próxima volta, Pode acontecer que os indices 0 e 1 no primeiro if já tenham sido criados mas os índices 2 e 3 ainda não;.
No final, o ArrayList retorno só poderá ter no máximo 4 posições.
Como resolver esses problemas?
Erro:
C:\java\AD2>java Principal
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.remove(Unknown Source)
at MenorCaminho.buscaMenorCaminho(MenorCaminho.java:100)
at Principal.main(Principal.java:44)
C:\java\AD2>
Carlos Rocha
Curtir tópico
+ 0Posts
16/10/2014
Carlos Rocha
ArrayList<Integer> menorCaminhoAL = menorCaminho.buscaMenorCaminho();
String texto = "";
for (int t = 0; t < menorCaminhoAL.size(); t++)
{
texto = texto + menorCaminhoAL.get(t);
}
System.out.println(texto);..
Saida de menorCaminhoAl
C:\java\AD2>java Principal [1, 3, 3, 2] [3, 1, 1, 4] C:\java\AD2>
Preciso fazer a saida acima sair assim:
{1- 3, 3- 2, 1,4}
Note que eu passei por uma função que verificou que [1,3] e [3,1] são o mesmo trajeto, logo, não deve repetir.
Estou tentando, como podem notar, com texto. Mas não sabendo usar a lógica.
Algum recurso?
Gostei + 0
16/10/2014
Ronaldo Lanhellas
public ArrayList<Integer> buscaMenorCaminho()
{
ArrayList<Integer> buscaMenorCaminhoAL = new ArrayList<Integer>();
int menor = distancia;
int PontoA, PontoB, pontoDistanciaAB;
buscaMenorCaminhoAL.add(null);
buscaMenorCaminhoAL.add(null);
buscaMenorCaminhoAL.add(null);
buscaMenorCaminhoAL.add(null);
for (int i = 0; i < this.menorCaminhoAL().size(); i++)
{
pontoA = this.menorCaminhoAL().get(i);
pontoB = this.menorCaminhoAL().get(i+1);
pontoDistanciaAB = this.menorCaminhoAL().get(i+2);
ArrayList<Integer> buscaDistancia = this.buscaDistancia(pontoB, this.pontoA);
int a = buscaDistancia.get(0);
int b = buscaDistancia.get(1);
int c = buscaDistancia.get(2);
if( pontoDistanciaAB + c < menor )
{
if(buscaMenorCaminhoAL.size() == 2)
{
buscaMenorCaminhoAL.add(null);
buscaMenorCaminhoAL.add(null);
}
menor = pontoDistanciaAB + c;
buscaMenorCaminhoAL.set(0, pontoA);
buscaMenorCaminhoAL.set(1, pontoB);
buscaMenorCaminhoAL.set(2, a);
buscaMenorCaminhoAL.set(3, b);
}
else
{
buscaMenorCaminhoAL.set(0, this.pontoA);
buscaMenorCaminhoAL.set(1, this.pontoB);
if (buscaMenorCaminhoAL.size() > 2)
{
buscaMenorCaminhoAL.remove(2);
buscaMenorCaminhoAL.remove(3);
}
}
i = i + 2;
}
return buscaMenorCaminhoAL;
}
A ideia aqui é se pontoDistanciaAB + c for menor que a variável menor, eu preciso set (configurar) o valor dos índices 0, 1, 2 e 3 do ArrayList . Porem, esses índices ainda não foram criados.
E se pontoDistanciaAB + c for maior ou igual a varável a, preciso set apenas os índices 0 e 1. E no caso remover os índices 3 e 4.
Isso em uma volta do loop.
Para a próxima volta, Pode acontecer que os indices 0 e 1 no primeiro if já tenham sido criados mas os índices 2 e 3 ainda não;.
No final, o ArrayList retorno só poderá ter no máximo 4 posições.
Como resolver esses problemas?
Erro:
C:\java\AD2>java Principal
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.remove(Unknown Source)
at MenorCaminho.buscaMenorCaminho(MenorCaminho.java:100)
at Principal.main(Principal.java:44)
C:\java\AD2>
Em relação ao primeiro item não entendi porque você usou "set()" em vez de "add(int index, E element)" no arrayList buscaMenorCaminhoAL. O arrayList cresce automaticamente quando você faz um "add()", se você usar o set() ele irá substituir o elemento corrente sem aumentar o tamanho do arrayList.
Gostei + 0
16/10/2014
Carlos Rocha
Veja, nesse código abaixo:
MenorCaminho menorCaminho = new MenorCaminho(pontoOA, pontoOB, listaDePossiveis, vizinhoNo, pontoPDistanciaAB); ArrayList<Integer> menorCaminhoAL = menorCaminho.buscaMenorCaminho(); System.out.println(menorCaminhoAL);
Eu tenho a seguinte saida:
C:\java\AD2>java Principal [1, 3, 3, 2] [3, 1, 1, 4] C:\java\AD2>
São 2 loops, por isso duas linhas;
Mas eu preciso fazer ainda duas coisas nesse código para terminar meu estudo.
A), 1,3 da primeira linha é igual à 3,1 da segunda linha. Preciso arranjar uma forma de remover o 3,1.
RemoveRepetidas listaSemRepeticao = new RemoveRepetidas(menorCaminhoAL); ArrayList<Integer> listaLimpa = listaSemRepeticao.removeRepetida();
B) A saída dever ser em uma só linha da forma abaixo:
{1-3, 3-2, 1-4}
Eu tentei fazer a remoção mas minha lógica não foi boa.
Pode me ajudar?
import java.util.ArrayList;
public class RemoveRepetidas
{
ArrayList<Integer> listaRepetida = new ArrayList<Integer>();
RemoveRepetidas (ArrayList<Integer> _listaRepetida)
{
this.listaRepetida = _listaRepetida;
}
ArrayList<Integer> removeRepetida()
{
ArrayList<Integer> listaSemRepeticao = new ArrayList<Integer>();
ArrayList<Integer> conta = new ArrayList<Integer>();
for (int i = 0; i < this.listaRepetida.size(); i++)
{
for (int j = i; j < this.listaRepetida.size(); j++)
{
if (
( this.listaRepetida.get(i) == this.listaRepetida.get(j) && this.listaRepetida.get(i+1) == this.listaRepetida.get(j+1) ) ||
( this.listaRepetida.get(i) == this.listaRepetida.get(j+1) && this.listaRepetida.get(i+1) == this.listaRepetida.get(j) )
)
{ conta.add(i); }
j++;
}
i++;
}
for (int i = 0; i < conta.size(); i++)
this.listaRepetida.remove(i);
for (int i = 0; i < this.listaRepetida.size(); i++)
listaSemRepeticao.add(this.listaRepetida.get(i));
return listaSemRepeticao;
}
}
[/code}
Na verdade não são duas posições: São dois objetos com o mesmo nome!
Veja a geração:
[code]
import java.util.ArrayList;
import java.io.File;
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.IOException;
public class Principal
{
public static void main (String args[])
{
CriaListas listaPossivel = new CriaListas("arquivoPossiveis.txt");
CriaListas listaObrigatorio = new CriaListas("arquivoObrigatorios.txt");
ArrayList<Ligacoes> listaDePossiveis = listaPossivel.populaArrayList();
ArrayList<Ligacoes> listaDeObrigatorios = listaObrigatorio.populaArrayList();
try {
File arquivo = new File("resp.txt");
FileWriter fw = new FileWriter(arquivo);
fw.write("{");
for (int i = 0; i < listaDeObrigatorios.size(); i++)
{
int pontoOA = listaDeObrigatorios.get(i).getPontoA();
int pontoOB = listaDeObrigatorios.get(i).getPontoB();
int pontoPA;
int pontoPB;
int pontoPDistanciaAB = 0;
boolean existe=false;
for (int j = 0; j < listaDePossiveis.size(); j++)
{
pontoPA = listaDePossiveis.get(j).getPontoA();
pontoPB = listaDePossiveis.get(j).getPontoB();
pontoPDistanciaAB = listaDePossiveis.get(j).getDistanciaAB();
if(
(
(pontoOA == pontoPA) || (pontoOA == pontoPB)
)&&
(
(pontoOB == pontoPA) || (pontoOB == pontoPB)
)
)
{
existe=true;
}
}
if(existe)
{
//O ponto escolhido esta na ArrayList Possíveis.
//Então, mostra a distancia.
BuscaVizinho vizinho = new BuscaVizinho(pontoOA, pontoOB, listaDePossiveis, pontoPDistanciaAB);
ArrayList<Integer> vizinhoNo = vizinho.buscarVizinho();
MenorCaminho menorCaminho = new MenorCaminho(pontoOA, pontoOB, listaDePossiveis, vizinhoNo, pontoPDistanciaAB);
ArrayList<Integer> menorCaminhoAL = menorCaminho.buscaMenorCaminho();
//AQUI menorCaminhoAl funciona
System.out.println("AQUI TEMOS O MELHOR CAMINHO COM AS COMBINAÇÕES REPETIDAS PARA ESSE OBJETO");
System.out.println(menorCaminhoAL);
System.out.println();
RemoveRepetidas listaSemRepeticao = new RemoveRepetidas(menorCaminhoAL);
ArrayList<Integer> listaLimpa = listaSemRepeticao.removeRepetida();
for (int p = 0; p < listaLimpa.size(); p++)
{
fw.write(menorCaminhoAL.get(p).toString()+"-");
}
fw.write(",");
//AQUI menorCaminhoAl vem errado por ser gerado dois objetos
System.out.println("DESCULPA, NÃO CONSEGUI FAZER A EXCLUSÃO APENAS DE UMA COMBINAÇÃO DUPLICADA. MAS TENTEI!");
System.out.println(listaLimpa);
System.out.println();
System.out.println();
}
}
fw.write("}");
fw.flush();
fw.close();
} catch (IOException e)
{
System.err.printf("Erro na abertura do arquivo: %s.\n", e.getMessage());
}
}
}
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)