48tc48
Janeiro 20, 2021, 10:36am
#1
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.Scanner;
public class lapr1ficheiro {
public static boolean lerficheiro(String fileName, double[] vetor, double[][] matrizLeslie) throws FileNotFoundException {
int linha;
String[] x;
String[] s;
String[] f;
File lerfile = new File(fileName + ".txt");
Scanner ler = new Scanner(lerfile);
while (ler.hasNextLine()) {
String exlinha = ler.nextLine(); // ler ate nao existir linhas
String criRray = String.valueOf(exlinha.charAt(0));
switch (criRray) {
case "x":
case "X":
x = exlinha.split(",|\\=");
if (x.length > 200) {
System.out.println("Ficheiro invalido insira outro ficheiro");
return false;
}
System.out.println(Arrays.toString(x));
for (int i = 1, y = 0; i < x.length; i += 2, y++) {
vetor[y] = Double.parseDouble(x[i]);
System.out.println(vetor[y]);
}
break;
case "s":
case "S":
s = exlinha.split(",|\\=");
if (s.length > 200) {
System.out.println("Ficheiro invalido insira outro ficheiro");
return false;
}
System.out.println(Arrays.toString(s));
break;
case "f":
case "F":
f = exlinha.split(",|\\=");
if (f.length > 200) {
System.out.println("Ficheiro invalido insira outro ficheiro");
return false;
}
System.out.println(Arrays.toString(f));
double[][] matrizDeLeslie = new double[f.length][f.length];
int k = 0;
for (int i = 1; i < matrizDeLeslie.length; i++) {
for (int j = 0; j < matrizDeLeslie.length; j++) {
matrizDeLeslie[0][j] = Double.parseDouble(f[j]);
if (i - 1 == j) {
matrizDeLeslie[i][j] = Double.parseDouble(s[k]);
k++;
break;
}
}
}
}
}
return true;
}
}
Pelo que vi aqui seu código não compila porque a variável s
“pode não ter sido inicializada” e isso quer dizer o seguinte:
Se o valor da variável criRray
for “s” ou “S” a variável s
será inicializada normalmente na linha abaixo.
s = exlinha.split(",|\\=");
Porém, se o valor de criRray
for “f” ou “F” a variável s
também seria utilizada na linha abaixo.
matrizDeLeslie[i][j] = Double.parseDouble(s[k]);
O problema é que neste ponto do seu programa s
não foi inicializada ainda e por isso o compilador reclama.
Diferente das variáveis de classe e variáveis de instancia, as variáveis locais como a s
devem ser inicializadas antes de serem usadas e é trabalho do programador assegurar isso.
Como uma forma rápida de resolver, vc poderia inicializar s
com um array vazio logo quando ela é declarada, assim:
String[] s = {};
Só que a sugestão acima é só um jeito “sujo” pra evitar o erro de compilação. É importante que vc reveja sua lógica pra ver se minha sugestão é realmente a melhor opção.
48tc48
Janeiro 20, 2021, 2:46pm
#4
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.Scanner;
public class lapr1ficheiro {
public static void main(String[] args) {
double[] vetor = new double[200];
double[][] matriz = new double[200][200];
try {
lerficheiro(“c:\Users\tiago\IdeaProjects\aprogpl3\src\gd”, vetor, matriz);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public static boolean lerficheiro(String fileName, double[] vetor, double[][] matrizLeslie) throws FileNotFoundException {
int linha;
int countClasses;
String[] x;
String[] s;
String[] f;
File lerfile = new File(fileName + ".txt");
Scanner ler = new Scanner(lerfile);
while (ler.hasNextLine()) {
String exlinha = ler.nextLine(); // ler ate nao existir linhas
String criRray = String.valueOf(exlinha.charAt(0));
switch (criRray) {
case "x":
case "X":
x = exlinha.split(",|\\=");
if (x.length > 200) {
System.out.println("Ficheiro invalido insira outro ficheiro");
return false;
}
System.out.println(Arrays.toString(x));
for (int i = 1, y = 0; i < x.length; i += 2, y++) {
countClasses = i;
vetor[y] = Double.parseDouble(x[i]);
System.out.print(vetor[y] + " ");
}
System.out.println();
break;
case "s":
case "S":
s = exlinha.split(",|\\=");
if (s.length > 200) {
System.out.println("Ficheiro invalido insira outro ficheiro");
return false;
}
System.out.println(Arrays.toString(s));
for (int i = 1, a = 1, y = 0; i < s.length; i += 2, a++, y++) {
countClasses = i;
matrizLeslie[a][y] = Double.parseDouble(s[i]);
System.out.print(matrizLeslie[a][y] + " ");
}
System.out.println();
break;
case "f":
case "F":
f = exlinha.split(",|\\=");
if (f.length > 200) {
System.out.println("Ficheiro invalido insira outro ficheiro");
return false;
}
System.out.println(Arrays.toString(f));
for (int i = 1, y = 0; i < f.length; i += 2, y++) {
countClasses = i;
matrizLeslie[0][y] = Double.parseDouble(f[i]);
System.out.print(matrizLeslie[0][y] + " ");
}
System.out.println();
break;
}
}
return true;
}
}
48tc48
Janeiro 20, 2021, 2:47pm
#5
mesmo assim algo nao esta bem nao sei
O caractere “\” tem um significado especial pro Java, por isso vc não pode criar Strings como vc fez: “um\caminho\qualquer”.
Vc precisa fazer “\\” quando quer usar essa barrinha: “um\\caminho\\qualquer”.
No seu caso, troque:
lerficheiro("c:\Users\tiago\IdeaProjects\aprogpl3\src\gd", vetor, matriz);
Por:
lerficheiro("c:\\Users\\tiago\\IdeaProjects\\aprogpl3\\src\\gd", vetor, matriz);
48tc48
Janeiro 20, 2021, 3:28pm
#7
48tc48:
String[] s;
sim eu tinha isso dessa forma ao passar para aqui é que alterou
Entendi. Então explica melhor o seu problema.
48tc48
Janeiro 20, 2021, 3:49pm
#9
se o ficheiro de texto for separado por linhas em branco da erro
Me manda um exemplo deste ficheiro pra eu testar aqui.
48tc48
Janeiro 20, 2021, 3:56pm
#11
s0=0.50, s1=0.80, s2=0.50
x00=20, x01=10, x02=40, x03=30
f0=0.50, f1=2.40, f2=1.00, f3=0.00
48tc48
Janeiro 20, 2021, 4:00pm
#12
s0=0.50, s1=0.80, s2=0.50
x00=20, x01=10, x02=40, x03=30
f0=0.50, f1=2.40, f2=1.00, f3=0.00
se o ficheiro for assim funciona
Ah sim, vc precisa dar um jeito de pular as linhas em branco. Olha, acho que consegui uma solução.
Sabe esse linha aqui:
String exlinha = ler.nextLine();
Então, abaixo dela, adicione isso:
if (exlinha.equals(""))
continue;
O continue
vai fazer o while “pular” sempre que a linha for vazia. Ou seja, se a linha for vazia, o código abaixo do continue
não será executado.
48tc48
Janeiro 20, 2021, 5:28pm
#14
sim era isso mesmo , muito obrigado se faltar mais alguma coisa aviso , muito obrigado
48tc48
Janeiro 20, 2021, 5:33pm
#15
s0=0.50, s1=0.80, s2=0.50
x00=20, x01=10, x02=40, x03=30
f0=0.50, f1=2.40, f2=1.00, f3=0.00
agora imaginemos que o x00,x01 nao esta ordenado do genero
s0=0.50, s1=0.80, s2=0.50
x03=20, x02=10, x01=40, x00=30
f0=0.50, f1=2.40, f2=1.00, f3=0.00
como posso organizar enquanto leio ?
Uma possibilidade seria assim:
case "x":
case "X":
String[] tmp = exlinha.split("[,\\s]+");
Arrays.sort(tmp);
x = String.join("=", tmp).split("=");
48tc48
Janeiro 20, 2021, 6:00pm
#17
e em vez de ordenar se der erro ao ler do genero criar um contador que compara o x e se nao for igual da erro
Ih, eu não entendi o que vc quis dizer.
48tc48
Janeiro 20, 2021, 6:04pm
#19
s0=0.50, s1=0.80, s2=0.50
x03=20, x02=10, x01=40, x00=30
f0=0.50, f1=2.40, f2=1.00, f3=0.00
se o ficheiro estiver desorganizado em vez de o ordenar simplesmente verificar que ele nao esta bem e dizer que esta errado
Um jeito seria copiar o array e depois comparar, assim:
case "x":
case "X":
String[] tmp = exlinha.split("[,\\s]+");
String[] tmp2 = Arrays.copyOf(tmp, tmp.length);
Arrays.sort(tmp);
if (!Arrays.equals(tmp, tmp2))
System.out.println("Está desorganizado!!!");
x = String.join("=", tmp).split("=");