Onde estou errando?

Java

10/10/2014

A ideia aqui é popular um array de inteiros e dar ele como return de uma função.

Mas toda vez que tento fazer função, o compilador pede static void main.

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.Scanner; 

public class LerArquivo3
{ 
  public static void main(String[] args) 
  { 
    try 
    { 
      FileReader arq = new FileReader("arquivoPossiveis.txt"); 
      BufferedReader lerArq = new BufferedReader(arq); 
      String linha = lerArq.readLine(); 
      int[6][3] arrayPossiveis;
	  int conta = 0;
	  
      // lê a primeira linha 
      // a variável "linha" recebe o valor "null" quando o processo 
      // de repetição atingir o final do arquivo texto 

      while (linha != null) 
      { 
         //System.out.printf("%s\n", linha); 
         linha = lerArq.readLine(); 
         for (int i=0; i<linha.length(); i++)
		 {
		    //System.out.print(linha.charAt(i));
			arrayPossiveis[conta][0] = Integer.valueOf(linha.charAt(0));
			arrayPossiveis[conta][1] = Integer.valueOf(linha.charAt(2));
			arrayPossiveis[conta][2] = Integer.valueOf(linha.charAt(4));
		 }
		 conta++;
		 //System.out.println();
         // lê da segunda até a última linha 
      } 

      arq.close(); 
    } catch (IOException e) 
    { 
      System.err.printf("Erro na abertura do arquivo: %s.\n", e.getMessage()); 
    } 
   System.out.println(); 
  } 
}

Aonde estou errando?
Carlos Rocha

Carlos Rocha

Curtidas 0

Respostas

Carlos Rocha

Carlos Rocha

10/10/2014

Acho que melhorou um pouco:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

public class LerArquivo4
{
//Classe sem atributos
LerArquivo4(String arquivo)
{
    this.leArquivo(arquivo);
}

private int[][] leArquivo(String arquivo)
{
      FileReader arq = new FileReader(arquivo);
      BufferedReader lerArq = new BufferedReader(arq);
      String linha = lerArq.readLine();
      int[][] arrayPossiveis = new int[2][3];
int conta = 0;

      // lê a primeira linha
      // a variável "linha" recebe o valor "null" quando o processo
      // de repetição atingir o final do arquivo texto

      while (linha != null)
      {
         //System.out.printf("%s\n", linha);
         linha = lerArq.readLine();
         for (int i=0; i<linha.length(); i++)
{
   //System.out.print(linha.charAt(i));
arrayPossiveis[conta][0] = Character.getNumericValue(linha.charAt(0));
arrayPossiveis[conta][1] = Character.getNumericValue(linha.charAt(2));
arrayPossiveis[conta][2] = Character.getNumericValue(linha.charAt(4));
}
conta++;
//System.out.println();
         // lê da segunda até a última linha
      }

      arq.close();
return arrayPossiveis;
   }
}

Mas ainda esta dando erro:
C:\java\ad2>javac LerArquivo4.java
LerArquivo4.java:16: error: unreported exception FileNotFoundException; must be
caught or declared to be thrown
      FileReader arq = new FileReader(arquivo);
                       ^
LerArquivo4.java:18: error: unreported exception IOException; must be caught or
declared to be thrown
      String linha = lerArq.readLine();
                                    ^
LerArquivo4.java:29: error: unreported exception IOException; must be caught or
declared to be thrown
         linha = lerArq.readLine();
                                ^
LerArquivo4.java:42: error: unreported exception IOException; must be caught or
declared to be thrown
      arq.close();
               ^
4 errors

C:\java\ad2>
GOSTEI 0
Carlos Rocha

Carlos Rocha

10/10/2014

Um erro ainda persiste:

Preciso retornar um array e não exibir ele. Pois vou usá-lo em outro arquivo em um loop.

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 

public class LerArquivo4
{ 

 public static void main (String[] args)
{
   String arquivo = "arquivoPossiveis.txt";
    try{
      FileReader arq = new FileReader(arquivo); 
      BufferedReader lerArq = new BufferedReader(arq); 
      String linha = lerArq.readLine(); 
      int[][] arrayPossiveis = new int[6][3];
	  int conta = 0;
	  
      // lê a primeira linha 
      // a variável "linha" recebe o valor "null" quando o processo 
      // de repetição atingir o final do arquivo texto
      while (linha != null) 
      { 
         for (int i=0; i<linha.length(); i++)
		 {
		    System.out.print(linha.charAt(i));
			arrayPossiveis[conta][0] = Character.getNumericValue(linha.charAt(0));
			arrayPossiveis[conta][1] = Character.getNumericValue(linha.charAt(2));
			arrayPossiveis[conta][2] = Character.getNumericValue(linha.charAt(4));
		 }
		 conta++;
		 System.out.println();
		 linha = lerArq.readLine(); 
         // lê da segunda até a última linha 
      } 

      arq.close(); 
	} catch (IOException e) 
    { 
      System.err.printf("Erro na abertura do arquivo: %s.\n", e.getMessage()); 
    }   
   }
}
GOSTEI 0
Carlos Rocha

Carlos Rocha

10/10/2014

Entendi.
Agora esta assim:

Criei 5 arquivos:


arquivoPossiveis.txt // com os numeros possiveis
arquivoObrigatorios.txt // com os numeros Obrigatorios

LerArquivoPossivel.java retornando um array multidimensional de int[6][3]
LerArquivoObrigatorio.java retornando um array multidimensional de int[2][2]

Principal.java. Com a saída principal

Uma coisa queria ver contigo: Deve ter uma forma de popular os dois arquivos ao mesmo tempo em java e ter um array multidimensional dinâmica.


arquivoPossiveis.txt // com os numeros possiveis
1 2 3
1 3 1
1 4 2
2 3 1
2 4 3
3 4 3

arquivoObrigatorios.txt // com os numeros Obrigatorios
1 2
3 4

LerArquivoPossivel.java retornando um array multidimensional de int[6][3]
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class LerArquivoPossivel
{
public static void main (String[] args)
{

}
int [][] getArray (String arquivo)
{
    return constroiArrayPossivel(arquivo);
}

int [][] constroiArrayPossivel(String arquivo)
{
    int [][] arrayImPossiveis = new int [0][0];
    try{
      FileReader arq = new FileReader(arquivo);
      BufferedReader lerArq = new BufferedReader(arq);
      String linha = lerArq.readLine();
      int[][] arrayPossiveis = new int[6][3];
int conta = 0;

      // lê a primeira linha
      // a variável "linha" recebe o valor "null" quando o processo
      // de repetição atingir o final do arquivo texto
      while (linha != null)
      {
         for (int i=0; i<linha.length(); i++)
{
arrayPossiveis[conta][0] = Character.getNumericValue(linha.charAt(0));
arrayPossiveis[conta][1] = Character.getNumericValue(linha.charAt(2));
arrayPossiveis[conta][2] = Character.getNumericValue(linha.charAt(4));
}
conta++;
linha = lerArq.readLine();
         // lê da segunda até a última linha
      }
      arq.close();
return arrayPossiveis;
} catch (IOException e)
    {
      System.err.printf("Erro na abertura do arquivo: %s.\n", e.getMessage());
return arrayImPossiveis;
    }  
   }
}

LerArquivoObrigatorio.java retornando um array multidimensional de int[2][2]
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class LerArquivoObrigatorio
{
public static void main (String[] args)
{

}
int [][] getArray (String arquivo)
{
    return constroiArrayObrigatorio(arquivo);
}

int [][] constroiArrayObrigatorio(String arquivo)
{
    int [][] arrayImObrigatorios = new int [0][0];
    try{
      FileReader arq = new FileReader(arquivo);
      BufferedReader lerArq = new BufferedReader(arq);
      String linha = lerArq.readLine();
      int[][] arrayObrigatorios = new int[2][2];
int conta = 0;

      // lê a primeira linha
      // a variável "linha" recebe o valor "null" quando o processo
      // de repetição atingir o final do arquivo texto
      while (linha != null)
      {
         for (int i=0; i<linha.length(); i++)
{
arrayObrigatorios[conta][0] = Character.getNumericValue(linha.charAt(0));
arrayObrigatorios[conta][1] = Character.getNumericValue(linha.charAt(2));
}
conta++;
linha = lerArq.readLine();
         // lê da segunda até a última linha
      }
      arq.close();
return arrayObrigatorios;
} catch (IOException e)
    {
      System.err.printf("Erro na abertura do arquivo: %s.\n", e.getMessage());
return arrayImObrigatorios;
    }  
   }
}

Principal.java. Com a saída principal

public class Principal
{
  public static void main (String[] args)
  {
    LerArquivoPossivel arquivoPossiveis = new LerArquivoPossivel();
int[][] arrayPossiveis = new int[6][3];
arrayPossiveis = arquivoPossiveis.getArray("arquivoPossiveis.txt");

    LerArquivoObrigatorio arquivoObrigatorios = new LerArquivoObrigatorio();
int[][] arrayObrigatorios = new int[2][2];
arrayObrigatorios = arquivoObrigatorios.getArray("arquivoObrigatorios.txt");
  }
}
GOSTEI 0
Carlos Rocha

Carlos Rocha

10/10/2014

Ok.

Por último.

Porque é que na linh 63 não imprime nada. Compilador não dá erro e roda normalmente?
import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.ArrayList;

public class Principal
{ 

    public static void main (String[] args)
    {
try{
      String arquivo = "arquivoPossiveis.txt";
      FileReader arq = new FileReader(arquivo); 
      BufferedReader lerArq = new BufferedReader(arq); 
      String linha = lerArq.readLine(); 
 int contaLinha = 0;
 int contaColuna = 0;
 int conta = 0;
      // lê a primeira linha 
      // a variável "linha" recebe o valor "null" quando o processo 
      // de repetição atingir o final do arquivo texto
      while (linha != null) 
      { 
    contaColuna = 0;
         for (int i=0; i<linha.length(); i++)
{
   contaColuna++;
}
contaLinha++;
linha = lerArq.readLine(); 
         // lê da segunda até a última linha 
      } 

 ArrayList<Ligacoes> LigacaoObrigatoria = new ArrayList<Ligacoes>();  
 ArrayList<Ligacoes> LigacaoPossivel = new ArrayList<Ligacoes>();  
    
      int[][] arrayRetorno = new int[contaLinha][contaColuna];

      while (linha != null) 
      { 
         for (int i=0; i<linha.length(); i++)
{
  if(contaColuna==3)
  {
     int pontoA = Character.getNumericValue(linha.charAt(0));
     int pontoB = Character.getNumericValue(linha.charAt(2));
         LigacaoObrigatoria.add(new Ligacoes(pontoA,pontoB));  
  }
  if(contaColuna==5)
  {
     int pontoA = Character.getNumericValue(linha.charAt(0));
     int pontoB = Character.getNumericValue(linha.charAt(2));
     int distancia = Character.getNumericValue(linha.charAt(4));
         LigacaoPossivel.add(new Ligacoes(pontoA,pontoB));  
         new Ligacoes(pontoA,pontoB).informaDistancia(distancia); 
  }
}
conta++;
linha = lerArq.readLine(); 
         // lê da segunda até a última linha 
      } 
      arq.close(); 

 for (int i = 0; i < LigacaoObrigatoria.size(); i++) 
 { 
        int s = LigacaoObrigatoria.get(i).getPontoA(); 
        System.out.println(s); 
 }

} catch (IOException e) 
    { 
      System.err.printf("Erro na abertura do arquivo: %s.\n", e.getMessage());     
}   

  }
}
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

10/10/2014

A ideia aqui é popular um array de inteiros e dar ele como return de uma função.

Mas toda vez que tento fazer função, o compilador pede static void main.

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.Scanner; 

public class LerArquivo3
{ 
  public static void main(String[] args) 
  { 
    try 
    { 
      FileReader arq = new FileReader("arquivoPossiveis.txt"); 
      BufferedReader lerArq = new BufferedReader(arq); 
      String linha = lerArq.readLine(); 
      int[6][3] arrayPossiveis;
	  int conta = 0;
	  
      // lê a primeira linha 
      // a variável "linha" recebe o valor "null" quando o processo 
      // de repetição atingir o final do arquivo texto 

      while (linha != null) 
      { 
         //System.out.printf("%s\n", linha); 
         linha = lerArq.readLine(); 
         for (int i=0; i<linha.length(); i++)
		 {
		    //System.out.print(linha.charAt(i));
			arrayPossiveis[conta][0] = Integer.valueOf(linha.charAt(0));
			arrayPossiveis[conta][1] = Integer.valueOf(linha.charAt(2));
			arrayPossiveis[conta][2] = Integer.valueOf(linha.charAt(4));
		 }
		 conta++;
		 //System.out.println();
         // lê da segunda até a última linha 
      } 

      arq.close(); 
    } catch (IOException e) 
    { 
      System.err.printf("Erro na abertura do arquivo: %s.\n", e.getMessage()); 
    } 
   System.out.println(); 
  } 
}

Aonde estou errando?



Pode o erro que está aparecendo no console executando este primeiro código.
GOSTEI 0
Carlos Rocha

Carlos Rocha

10/10/2014

Vou postar as 3 classes

Distancias.java
public class Distancias extends Ligacoes
{
  private int distancia;

  Distancias(int a, int b)
  {
     super (a,b);  
  }

  public void setDistancia(int c)
  {
    this.distancia = c;
  }

  public int getDistancia ()
  {
    return this.distancia;
  }

}

Ligacoes.java
public class Ligacoes
{
  private int pA, pB;
  private Distancias distancia;

  Ligacoes (int a, int b)
  {
    this.pA = a;
    this.pB = a;
  }

  public void informaDistancia (int _distancia)
  {
     distancia = new Distancias (this.pA, this.pB);
     distancia.setDistancia(_distancia);
//System.out.println(distancia.getDistancia());
  }

  public int getPontoA ()
  {
    return this.pA;
  }

  public int getPontoB ()
  {
    return this.pB;
  }  

  public int getDistanciaAB ()
  {
    return this.distancia.getDistancia();
  }  
}

Principal.java
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

public class Principal
{
    public static void main (String[] args)
    {
try{
      String arquivo = "arquivoPossiveis.txt";
      FileReader arq = new FileReader(arquivo);
      BufferedReader lerArq = new BufferedReader(arq);  
      String linha = lerArq.readLine();  
ArrayList<Ligacoes> LigacaoObrigatoria = new ArrayList<Ligacoes>();  
ArrayList<Ligacoes> LigacaoPossivel = new ArrayList<Ligacoes>();  
boolean possivel;

      // lê a primeira linha
      // a variável "linha" recebe o valor "null" quando o processo de repetição atingir o final do arquivo texto

int pontoA, pontoB, distancia, contaColuna;

      while (linha != null)
      {
   contaColuna = linha.length();

pontoA = Character.getNumericValue(linha.charAt(0));
pontoB = Character.getNumericValue(linha.charAt(2));

if(contaColuna>=5)
{
  distancia = Character.getNumericValue(linha.charAt(4));  
      LigacaoPossivel.add(new Ligacoes(pontoA,pontoB));  
      new Ligacoes(pontoA,pontoB).informaDistancia(distancia);
}
else
{
      LigacaoObrigatoria.add(new Ligacoes(pontoA,pontoB));  
}

linha = lerArq.readLine();
        // lê da segunda até a última linha
      }

arq.close();

for (int i = 0; i < LigacaoPossivel.size(); i++)
{
        int s = LigacaoPossivel.get(i).getDistanciaAB();
        System.out.println(s);
}

} catch (IOException e)
    {
      System.err.printf("Erro na abertura do arquivo: %s.\n", e.getMessage());    
}
  }
}

Compila normal.

Mas dá erro de execução:
C:\java\2>java Principal
Exception in thread "main" java.lang.NullPointerException
        at Ligacoes.getDistanciaAB(Ligacoes.java:31)
        at Principal.main(Principal.java:50)

C:\java\2>


Ou seja: Como faço para, à partir da classe Principal, pegar o valor da variável distancia que esta na classe Distancias que estende a classe Ligações?
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

10/10/2014

O erro está aqui neste trecho

distancia = Character.getNumericValue(linha.charAt(4));  
      LigacaoPossivel.add(new Ligacoes(pontoA,pontoB));  
      new Ligacoes(pontoA,pontoB).informaDistancia(distancia); // <-----ERRO AQUI



Você está criando o objeto Ligacoes mas não está atribuindo a nada, perdendo sua referência. Imagino que o que você queira é criar e depois adicionar na lista, então o certo seria:

distancia = Character.getNumericValue(linha.charAt(4));  
Ligacoes lig = new Ligacoes(pontoA,pontoB);
lig.informaDistancia(distancia);
      LigacaoPossivel.add(lig);  
GOSTEI 0
Carlos Rocha

Carlos Rocha

10/10/2014

Assim?
      while (linha != null) 
      { 
	    contaColuna = linha.length();
		 
		pontoA = Character.getNumericValue(linha.charAt(0));
		pontoB = Character.getNumericValue(linha.charAt(2));

		if(contaColuna>=5)
		{
           distancia = Character.getNumericValue(linha.charAt(4));  
           Ligacoes lig = new Ligacoes(pontoA,pontoB);
           lig.informaDistancia(distancia);
           LigacaoPossivel.add(lig);  		
		}	
		else
		{
           Ligacoes lig = new Ligacoes(pontoA,pontoB);
           LigacaoObrigatoria.add(lig);  		
		}

		linha = lerArq.readLine(); 
        // lê da segunda até a última linha 
      } 

É, deu certo.
Obrigado!
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

10/10/2014

Assim?
      while (linha != null) 
      { 
	    contaColuna = linha.length();
		 
		pontoA = Character.getNumericValue(linha.charAt(0));
		pontoB = Character.getNumericValue(linha.charAt(2));

		if(contaColuna>=5)
		{
           distancia = Character.getNumericValue(linha.charAt(4));  
           Ligacoes lig = new Ligacoes(pontoA,pontoB);
           lig.informaDistancia(distancia);
           LigacaoPossivel.add(lig);  		
		}	
		else
		{
           Ligacoes lig = new Ligacoes(pontoA,pontoB);
           LigacaoObrigatoria.add(lig);  		
		}

		linha = lerArq.readLine(); 
        // lê da segunda até a última linha 
      } 

É, deu certo.
Obrigado!


Isso mesmo, mas no else você pode deixar como estava

else{
           LigacaoObrigatoria.add(new Ligacoes(pontoA,pontoB));   
GOSTEI 0
Carlos Rocha

Carlos Rocha

10/10/2014

Um, mas vou precisar de outra orientação tua.

Preciso criar 2 listas:

Uma que vai ter como base o arquivo arquivoPossiveis.txt e outra que terá por base o arquivo arquivoObrigatorios.txt.

Parece que terei que colocar isso tudo dentro de uma função que retorne um ArrayList e recebe como parâmetros o nome do arquivo,

Pode me orientar?

Tentei assim mas não deu certo:
import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.ArrayList;

public class Principal
{ 
    public static void main (String[] args)
    {
	   populaArrayList("arquivoPossiveis.txt");
	   populaArrayList("arquivoObrigatorios.txt");
	}
	ArrayList<Ligacoes> populaArrayList (String arquivo)
	{
	try{
      //String arquivo = "arquivoPossiveis.txt";
      FileReader arq = new FileReader(arquivo); 
      BufferedReader lerArq = new BufferedReader(arq);  
      String linha = lerArq.readLine(); 	  
	  ArrayList<Ligacoes> Ligacao = new ArrayList<Ligacoes>();  
	  
      // lê a primeira linha 
      // a variável "linha" recebe o valor "null" quando o processo de repetição atingir o final do arquivo texto
	  
	  int pontoA, pontoB, distancia, contaColuna;
	  
      while (linha != null) 
      { 
	    contaColuna = linha.length();
		 
		pontoA = Character.getNumericValue(linha.charAt(0));
		pontoB = Character.getNumericValue(linha.charAt(2));
        Ligacoes lig;
		
		if(contaColuna>=5)
		{
           distancia = Character.getNumericValue(linha.charAt(4));  
           lig = new Ligacoes(pontoA,pontoB);
           lig.informaDistancia(distancia);
		}	
		else
		{
           lig = new Ligacoes(pontoA,pontoB);
		}
        Ligacao.add(lig);  		

		linha = lerArq.readLine(); 
        // lê da segunda até a última linha 
      } 
      
	  arq.close(); 
	  return Ligacao;
	  
	} catch (IOException e) 
    { 
      System.err.printf("Erro na abertura do arquivo: %s.\n", e.getMessage());     
	  return ArrayList<Ligacoes>;
	} 
  }
}
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

10/10/2014

Mas o que não deu certo ? Você quer adicionar os 2 arquivos no mesmo objeto ArrayList ?
GOSTEI 0
Carlos Rocha

Carlos Rocha

10/10/2014

Na verdade é o seguinte:
Tenho dois arquivos de texto:

arquivoObrigatorios.txt
1 2
3 4
arquivoPossiveis.txt
1 2 3
1 3 1
1 4 2
2 3 1
2 4 3
3 4 3

Com eles, preciso popular 2 Array'sList's (entendeu né? rsrs) para depois compara-los.
GOSTEI 0
Carlos Rocha

Carlos Rocha

10/10/2014

Dei mais uma mexida mas não adiantou:
import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.ArrayList;

public class Principal
{ 
    public static void main (String[] args)
    {
	  ArrayList<Ligacoes> Possiveis = populaArrayList("arquivoPossiveis.txt");
	  ArrayList<Ligacoes> Obrigatorios = populaArrayList("arquivoObrigatorios.txt");
	}
	ArrayList<Ligacoes> populaArrayList (String arquivo)
	{
	try{
      FileReader arq = new FileReader(arquivo); 
      BufferedReader lerArq = new BufferedReader(arq);  
      String linha = lerArq.readLine(); 	  
	  ArrayList<Ligacoes> Ligacao = new ArrayList<Ligacoes>();  
	  ArrayList<Ligacoes> vazio  = new ArrayList<Ligacoes>();    
	  
      // lê a primeira linha 
      // a variável "linha" recebe o valor "null" quando o processo de repetição atingir o final do arquivo texto
	  
	  int pontoA, pontoB, distancia, contaColuna;
	  
      while (linha != null) 
      { 
	    contaColuna = linha.length();
		 
		pontoA = Character.getNumericValue(linha.charAt(0));
		pontoB = Character.getNumericValue(linha.charAt(2));
        Ligacoes lig;
		
		if(contaColuna>=5)
		{
           distancia = Character.getNumericValue(linha.charAt(4));  
           lig = new Ligacoes(pontoA,pontoB);
           lig.informaDistancia(distancia);
		}	
		else
		{
           lig = new Ligacoes(pontoA,pontoB);
		}
        Ligacao.add(lig);  		

		linha = lerArq.readLine(); 
        // lê da segunda até a última linha 
      } 
      
	  arq.close(); 
	  return Ligacao;
	  
	} catch (IOException e) 
    { 
	  return vazio;
      System.err.printf("Erro na abertura do arquivo: %s.\n", e.getMessage());     	} 
  }
}
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

10/10/2014

Na verdade é o seguinte:
Tenho dois arquivos de texto:

arquivoObrigatorios.txt
1 2
3 4
arquivoPossiveis.txt
1 2 3
1 3 1
1 4 2
2 3 1
2 4 3
3 4 3

Com eles, preciso popular 2 Array'sList's (entendeu né? rsrs) para depois compara-los.


Dados os arquivos acima que você mostro, eles tem formatação diferente, então você não pode usar o mesmo método. Até porque seu método está usando até a coluna 5 mas só vejo no máximo 3 colunas no arquivo.
GOSTEI 0
Carlos Rocha

Carlos Rocha

10/10/2014

Não, você não entendeu!

Cada coluna é 1 carácter na linha. Por isso carácter 5.

Viu como criei a função e chamei ela de dentro do método main? Pois é. Não funciona.

A questão de comparar, depois vou fazer um loop assim:

Pegar a primeira linha do ArrayList Obrigatórios e vou ver lá: 1 e 2.

Vou procurar nas linhas do ArrayList possiveis e ver se existe lá uma linha aonde os dois primeiros números ou são 1 e 2 ou 2 e 1 e o terceiro valor do array Possiveis é a distancia entre os pontos 1 e 2.

Preciso como isso ver se existe uma forma de eu ir de 1 para 2 anda que passando por exemplo 1-3, 3-2 e que tenho custo menor que 1-2 direto.

Sei. Vai dar trabalho. É de faculdade a distancia!

Veja como ficou a última alteração eliminado o método main e criando o construtor da classe:
Ele esta dando o erro do try sem ao menos o construtor estar sendo chamado por outra classe.
import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.ArrayList;

public class CriaArrays
{ 
	String arquivo;

    CriaArrays(String _arquivo)
    {
	  this.arquivo = _arquivo;
	}
	
	ArrayList<Ligacoes> populaArrayList (String arquivo)
	{
	  ArrayList<Ligacoes> vazio  =  new ArrayList<Ligacoes>();    
	  try
	  {
        FileReader arq = new FileReader(arquivo); 
        BufferedReader lerArq = new BufferedReader(arq);  
        String linha = lerArq.readLine(); 	  
	    ArrayList<Ligacoes> Ligacao = new ArrayList<Ligacoes>();  
	 	int pontoA, pontoB, distancia, contaColuna; 
  
        while (linha != null) 
        { 
	      contaColuna = linha.length();
		 
	      pontoA = Character.getNumericValue(linha.charAt(0));
		  pontoB = Character.getNumericValue(linha.charAt(2));
          Ligacoes lig;
		
		  if(contaColuna>=5)
		  {
            distancia = Character.getNumericValue(linha.charAt(4));  
            lig = new Ligacoes(pontoA,pontoB);
            lig.informaDistancia(distancia);
		  }	
		  else
		  {
            lig = new Ligacoes(pontoA,pontoB);
		  }
          Ligacao.add(lig);  		

		  linha = lerArq.readLine(); 
          // lê da segunda até a última linha 
        } 
      
	    arq.close(); 
	    return Ligacao;	  
	} catch (IOException e) 
    { 
      System.err.printf("Erro na abertura do arquivo: %s.\n", e.getMessage());     	
	  return vazio;
	} 
  }
}
[code]
C:\java\2>javac CriaArrays.java
CriaArrays.java:60: error: unreachable statement
      System.err.printf("Erro na abertura do arquivo: %s.\n", e.getMessage());

      ^
CriaArrays.java:62: error: missing return statement
  }
  ^
2 errors

C:\java\2>

Onde estou errando?
GOSTEI 0
Carlos Rocha

Carlos Rocha

10/10/2014

Terminei.
Final
arquivoPossiveis.txt
1 2 3
1 3 1
1 4 2
2 3 1
2 4 3
3 4 3 

arquivoObrigatorios.txt
1 2
3 4 

Principal.java
import java.util.ArrayList;

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();
	
	for (int i = 0; i < listaDePossiveis.size(); i++)
    {
        int s = listaDePossiveis.get(i).getDistanciaAB();
        System.out.println(s);
   }

  }
}

CriaListas.java
import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.ArrayList;

public class CriaListas
{ 
	String arquivo;

    CriaListas(String _arquivo)
    {
	  this.arquivo = _arquivo;
	}
	
	ArrayList<Ligacoes> populaArrayList ()
	{
	  ArrayList<Ligacoes> vazio  =  new ArrayList<Ligacoes>();    
	  try
	  {
        FileReader arq = new FileReader(this.arquivo); 
        BufferedReader lerArq = new BufferedReader(arq);  
        String linha = lerArq.readLine(); 	  
	    ArrayList<Ligacoes> Ligacao = new ArrayList<Ligacoes>();  
	 	int pontoA, pontoB, distancia, contaColuna; 
  
        while (linha != null) 
        { 
	      contaColuna = linha.length();
		 
	      pontoA = Character.getNumericValue(linha.charAt(0));
		  pontoB = Character.getNumericValue(linha.charAt(2));
          Ligacoes lig;
		
		  if(contaColuna>=5)
		  {
            distancia = Character.getNumericValue(linha.charAt(4));  
            lig = new Ligacoes(pontoA,pontoB);
            lig.informaDistancia(distancia);
		  }	
		  else
		  {
            lig = new Ligacoes(pontoA,pontoB);
		  }
          Ligacao.add(lig);  		

		  linha = lerArq.readLine(); 
          // lê da segunda até a última linha 
        } 
      
	    arq.close(); 
	    return Ligacao;	  
	} catch (IOException e) 
    { 
      System.err.printf("Erro na abertura do arquivo: %s.\n", e.getMessage());     	
	  return vazio;
	} 
  }
}

Ligacoes.java
public class Ligacoes
{
  private int pA, pB;
  private Distancias distancia;
  
  Ligacoes (int a, int b)
  {
    this.pA = a;
    this.pB = a;
  }

  public void informaDistancia (int _distancia)
  {
     distancia = new Distancias (this.pA, this.pB);
     distancia.setDistancia(_distancia);
	 //System.out.println(distancia.getDistancia());
  }
  
  public int getPontoA ()
  {
    return this.pA;
  }

  public int getPontoB ()
  {
    return this.pB;
  }  
  
  public int getDistanciaAB ()
  {
    return this.distancia.getDistancia();
  }  
}

Distancias.java
public class Distancias extends Ligacoes
{
  private int distancia;
  
  Distancias(int a, int b)
  {
	super (a,b);  
  }
  
  public void setDistancia(int c)
  {
    this.distancia = c;
  }

  public int getDistancia ()
  {
    return this.distancia;
  }

}

Dúvida: Tem como melhorar? Como? Me ajudem! Quero melhorar (enxugar).
Um problema que ocorre e que não sei ainda como tratar é que nos arquivos textos, eu tirei a primeira linha que diz quantas linhas o arquivo terá para baixo.
Exemplo:
arquivoPossiveis.txt
6             // 6 linhas de pontos possiveis.
1 2 3
1 3 1
1 4 2
2 3 1
2 4 3
3 4 3 

Alguma ideia?
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

10/10/2014

Creio que o seu código já esteja bem organizado com a divisão que você fez, só não ficou padronizada o nome da classe "CriaListas".
GOSTEI 0
Carlos Rocha

Carlos Rocha

10/10/2014

Orientações à respeito?

Andei mudando a classe principal e criei outra classe BuscaMelhorCaminho que ainda esta sendo desenvolvida(vai dar muito trabalho)
BuscaMelhorCaminho.java
import java.util.ArrayList;

public class BuscaMelhorCaminho
{
    int pontoA, pontoB, distancia;
	ArrayList<Ligacoes> Possiveis;
	
	BuscaMelhorCaminho(int pontoA, int pontoB, ArrayList<Ligacoes> Possiveis, int distancia)
	{
	  this.pontoA = pontoA;
	  this.pontoB = pontoB;
	  this.distancia = distancia;
	  this.Possiveis = Possiveis;	  	  
	}
	int buscarMelhorCaminho ()
	{
  	  for (int j = 0; j < this.Possiveis.size(); j++)
      {  
          int pontoPA = this.Possiveis.get(j).getPontoA();
          int pontoPB = this.Possiveis.get(j).getPontoB();
          int pontoPDistanciaAB = this.Possiveis.get(j).getDistanciaAB();
		  
		  if(
		      (
			   (pontoPA == this.pontoB) || (pontoPB == this.pontoB)
			  )
			  && pontoPA != this.pontoA && pontoPB != this.pontoA
			)
			{
			   //Existe vizinho de B. 
			   //Logo, armazenemos esses vizinhos em um ArrayList vizinhosB para depois ver quem é mais perto.
			   return pontoPB;
			}
      }
	
	  return this.pontoA;
	}
}

Principal.java
iimport java.util.ArrayList;

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();
	boolean achei;
	
	for (int i = 0; i < listaDeObrigatorios.size(); i++)
    {
      int pontoOA = listaDeObrigatorios.get(i).getPontoA();
      int pontoOB = listaDeObrigatorios.get(i).getPontoB();
	  
	  achei = false;
      int pontoPA;
      int pontoPB;
      int pontoPDistanciaAB = 0;
	  
  	  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)
			  )
			)
			{
			   //O ponto escolhido esta na ArrayList Possíveis. 
			   //Então, mostra a distancia.
			   achei = true;
			   break;			   
			}
      }
	  
	  if(achei) 
  	  {			   
		BuscaMelhorCaminho melhorCaminho = new BuscaMelhorCaminho(pontoOA, pontoOB, listaDePossiveis, pontoPDistanciaAB);
		int melhorCaminhoNo = melhorCaminho.buscarMelhorCaminho();
		System.out.println(melhorCaminhoNo);
	  }
    }
	
  }
}
GOSTEI 0
POSTAR