Podem me ajudar , pq nao esta a funcionar

34 respostas Resolvido
4
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;
        }
    }

34 Respostas

R

Qual erro ta ocorrendo ?

wldomiciano

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.

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;
}

}

4

mesmo assim algo nao esta bem nao sei

wldomiciano

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);
4

sim eu tinha isso dessa forma ao passar para aqui é que alterou

wldomiciano

Entendi. Então explica melhor o seu problema.

4

se o ficheiro de texto for separado por linhas em branco da erro

wldomiciano

Me manda um exemplo deste ficheiro pra eu testar aqui.

4

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

4

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

wldomiciano
Solucao aceita

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.

4

sim era isso mesmo , muito obrigado se faltar mais alguma coisa aviso , muito obrigado

4

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 ?

wldomiciano

Uma possibilidade seria assim:

case "x":
case "X":
  String[] tmp = exlinha.split("[,\\s]+");
  Arrays.sort(tmp);
  x = String.join("=", tmp).split("=");
4

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

wldomiciano

Ih, eu não entendi o que vc quis dizer.

4

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

wldomiciano

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("=");
4

nao pode ser do genero criar uma int p=0 e simplesmente comparar com o x00 se for igual p++ se nao erro e fecha o programa

wldomiciano

Não entendi, mas de qualquer forma o que eu mostre foi só uma sugestão rápida. A questão é: É possível fazer o que vc quer, então é só vc implementar do jeito que faz mais sentido pro seu problema.

4

ok eu vou ver se consigo fazer como estou a pensar mas muito obrigado

4

da sua maneira o programa avisa que esta desorganizado mas organiza
eu quero que ele dê erro e avise o utilizador para ele organizar o ficheiro

wldomiciano

Pra não organizar, remova a linha Arrays.sort(tmp);.

Pra encerrar vc poderia fazer algo assim:

if (!Arrays.equals(tmp, tmp2))
  return false;
4

mas nao da para fazeer c o primeiro codigo sem precisar do tmp array??

wldomiciano

Vc tem que me explicar melhor o que vc quer. Deu erro? Qual erro? Ainda não é o que vc quer? Qual o problema com o array tmp?

4

o utilizador escreve aquele ficheiro de texto
como o ficheiro nao esta correto quero que o programa avise o utilizador e termine

4

nao estou a conseguir explicar bem desculpe

wldomiciano

Assim tá saindo:

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("Não está organizado");
    return false;
  }

  x = String.join("=", tmp).split("=");
4

assim organiza e escreve a matriz , eu quero mesmo que dê erro no programa e nao escreva nada

4

sim assim ja esta certo afinal , peço desculpa n tinha reparado , muito obrigado

4

boas, surgiu outro problema , o utilizador nao pode inserir numeros negativos como faço isso??

wldomiciano

Não tenho certeza, mas acredito que vc vai ter que fazer a verificação dentro daquele for que vc transforma em Doubles.

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] + " ");
}

No caso seria algo assim:

if (vetor[y] < 0)
  // mostra mensagem de erro aqui
else
  // faz o print normalemente aqui
4

sim acho que resolveu o problema , muito obrigado

Criado 20 de janeiro de 2021
Ultima resposta 22 de jan. de 2021
Respostas 34
Participantes 3