GARANTIR DESCONTO

Fórum Criar, Editar e Remover determinado item de um ArrayList #497767

14/10/2014

0

Pessoal.

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

Carlos Rocha

Responder

Posts

16/10/2014

Carlos Rocha

A situação agora é outra (manipulação de strings):

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?
Responder

Gostei + 0

16/10/2014

Ronaldo Lanhellas

Pessoal.

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.
Responder

Gostei + 0

16/10/2014

Carlos Rocha

Sim. A ideia é exatamente substituir mas o quadro agora mudou.

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());      
}
  
  }
}
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar