Onde estou errando?
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.
Aonde estou errando?
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
Curtidas 0
Respostas
Carlos Rocha
10/10/2014
Acho que melhorou um pouco:
Mas ainda esta dando erro:
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
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.
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
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
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
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
10/10/2014
Ok.
Por último.
Porque é que na linh 63 não imprime nada. Compilador não dá erro e roda normalmente?
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
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.
Aonde estou errando?
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
10/10/2014
Vou postar as 3 classes
Distancias.java
Ligacoes.java
Principal.java
Compila normal.
Mas dá erro de execução:
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?
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
10/10/2014
O erro está aqui neste trecho
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));
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
10/10/2014
Assim?
É, deu certo.
Obrigado!
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
10/10/2014
Assim?
É, deu certo.
Obrigado!
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
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:
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
10/10/2014
Mas o que não deu certo ? Você quer adicionar os 2 arquivos no mesmo objeto ArrayList ?
GOSTEI 0
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.
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
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
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.
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
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.
Onde estou errando?
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
10/10/2014
Terminei.
Final
arquivoPossiveis.txt
arquivoObrigatorios.txt
Principal.java
CriaListas.java
Ligacoes.java
Distancias.java
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
Alguma ideia?
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
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
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
Principal.java
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