TransWikia.com

Extraer enteros de una cadena JAVA

Stack Overflow en español Asked by Johann Duran on December 22, 2021

tengo esta cadena (LIXA ABIMERHI JUAN JOSE,DISEÑO DE INTERFACES,90,88,81,90)
y me estan pidiendo:

  1. Leer los datos por líneas usando el método split de la clase String separar los campos.
  2. Convertir a número entero las 4 cadenas de texto de calificaciones y calcular el promedio de ellas.

(son cadenas contenidas en un archivo)

Mi código:

Scanner sc = new Scanner(System.in);
File file = new File("E:/SEMESTRE2/POO/PROGRAMAS/TareasSem2/src/U6/Calificaciones.txt");
if (!file.exists()) 
{
    System.out.println ("No existe el archivo: "+file);
    System.exit(1);
}
System.out.println ("Archivo Encontrado");
System.out.print ("Escribe El Promedio Minimo ");
int prom = sc.nextInt();
try 
{

    FileReader fr = new FileReader(file);
    BufferedReader bfr = new BufferedReader(fr);
    String linea=bfr.readLine();
    String[] parts = linea.split(","); 

    //nombre> parts[0] materia parts[1] num1 parts [2]

    //System.out.println(linea);
    while (linea != null) 
    {
            double num = 0, mat, promA = 0;
            for(int i = 2;i>=2&&i<=5;i++)
            {

            mat=Double.parseDouble(parts[i]);
            num = num + mat;
            promA = num / 4;

            }
            System.out.println(linea+"  "+promA);


        linea=bfr.readLine();
    }
    /*while (linea != null) 
    {
        double num = 0, mat, promA = 0;
            for(int i = 2;i>=2&&i<=5;i++)
            {

            mat=Double.parseDouble(parts[i]);
            num = num + mat;
            promA = num / 4;

            }

            System.out.println(promA);
        linea=bfr.readLine();
    }*/
    bfr.close();
    fr.close();
}
catch (java.io.FileNotFoundException ex) 
{
    System.out.println ("No existe el archivo: "+file);
}
catch (java.io.IOException ex) 
{
    System.out.println ("Error al leer el archivo: "+file);
}//fin del catch IO

ok ya encontre como solo que ahora me imprime siempre el mismo promedio y no reinicia

3 Answers

tengo otro método mediante el cual puedes sacar los tres números sin problemas en un array y después manipular dichas notas como int para realizar lo que tu quieras con ello.

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    File file = new File("/home/pietrodeocre/git/EjerciciosDAMeclipse/src/PracticasStackOverFlow/Texto.txt");

    if (!file.exists()) {
        System.out.println ("No existe el archivo: "+file);
        System.exit(1);
    }
    System.out.println ("Archivo Encontrado");
    //System.out.print ("Escribe El Promedio Minimo ");
    //int prom = sc.nextInt();
    int[] notas = new int[4];
    List<String> infoList = new ArrayList<String>();
    infoList = tokenizador(file);

    for(int i = 0; i< infoList.size();i++) {
        notas[0]  = new Integer(infoList.get(i+2));
    }

    notas[1]  = new Integer(infoList.get(3));
    notas[2]  = new Integer(infoList.get(4));
    notas[3]  = new Integer(infoList.get(5));

    System.out.println("Nostas: " +notas[0] + ", " + notas[1]+ ", " + notas[2] + ", " + notas[3] );

}

/*
 * Devuelve una lista con las palabras de un archivo
 */
public static List<String> tokenizador(File ruta) {

    FileInputStream fis = null;
    BufferedReader dais = null;
    String cadenaString = null;
    StringTokenizer tokenizador = null;
    String tok = null;
    List<String> tokList = null;

    try {

        fis = new FileInputStream(ruta);
        dais = new BufferedReader(new InputStreamReader(fis));
        tokList = new ArrayList<String>();

        while ((cadenaString = dais.readLine()) != null) {

            tokenizador = new StringTokenizer(cadenaString, ",");

            while (tokenizador.hasMoreTokens()) {

                tok = tokenizador.nextToken();

                tokList.add(tok);

            }

        }       

    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        try {
            dais.close();
        } catch (final IOException e2) {
            e2.printStackTrace();
        }finally {

        }
    }
    return tokList;
}

Espero que te sirva y a los demás para hacer uso de la clase StringTokenizer que es muy útil.

Answered by Pietrodeocre ocre on December 22, 2021

Perdoname, ingles es mi primer idioma. No dudes en pedir aclaraciónes.

Podemos hacer la leyendas de cadena con el utilidad Scanner.

String direccion = "cadenas.dat";
File documento = new File(direccion);
Scanner lector = null;
try {
    lector = new Scanner(documento);
} catch (FileNotFoundException e1) {
    System.err.println("No puedo leer " + direccion);
    System.exit(1);
}
System.out.println("Archivo encontrado.");

Scanner teclado = new Scanner(System.in);
System.out.print("Escribe el promedio minimo: ");
double minPromedio = teclado.nextDouble();


// Verificas que el documento tiene mas lineas por leer.
while(lector.hasNextLine()) {
    String linea = lector.nextLine();

    String[] partes = linea.split(",");
    String nombre = partes[0];
    String profesion = partes[1];

    double calSuma = 0; // La suma de los calificaciones
    int cuantosCal = 0; // La numero de calificaciones que inclue en los calculaciones.
    for(int i = 2; i < partes.length; i++) {
        try {
            double calificacion = Double.parseDouble(partes[i]);
            cuantosCal++;
            calSuma += calificacion;
        } catch (Exception e) {
            System.err.print("Encontre un numero que no puedo leer.");
            continue; // Omites la numero corriente.
        }
    }

    double promedio = calSuma / cuantosCal;

    System.out.println(nombre + " tiene un calificacion promedio de " + promedio + ".");

    // Verificas que la promedio es el mismo o mas alto de la promedio minimo.
    if(promedio >= minPromedio) {
        System.out.println(nombre
                + " tiene un calification promedio que cumple con el requisito.");
    }
}

lector.close();
teclado.close();

Creo que esta código puede hacer que tu quieres, pero esta diseño es difícil para cambio por código que puede reiniciar.

Si te quieres código que puede reiniciar, necesitas poner los lineas en un List antes de haces los cálculos, porque la utilidad Scanner no puede volver al principio del archivo (excepto cuando reinicializar la Scanner objeto).

Answered by Funny Geeks on December 22, 2021

para cargar el archivo se sugiero este código:

public List<String> cargarArchivo(String direccion){
    List<String> lineas = new ArrayList<>();

    try {
        Path ruta = Paths.get(direccion);
        Stream<String> flujoFormateado = Files.lines(ruta, Charset.forName("UTF-8")); // cargando el archivo plano
        flujoFormateado.forEach(lineas::add); // almacenando todos los elementos para su analisis

        System.out.println("lineas guardadas: "+lineas.size());
    } catch (IOException ex) {
        Logger.getLogger(Otros.class.getName()).log(Level.SEVERE, null, ex);
    }

    return lineas;
}

luego de tener todas las lineas de interes puedes recorrerlas y sacar el promedio de cada una de ellas, pero tomando en cuenta el ejemplo que distes puedes hacer lo siguiente:

public void calculoPromedio(){
    String cadena = "LIXA ABIMERHI JUAN JOSE,DISEÑO DE INTERFACES,90,88,81,90";
    String partes[] = cadena.split(",");

    System.out.println("s: "+cadena.split(",").length);

    double promedio = ( Integer.valueOf(partes[2]) + Integer.valueOf(partes[3]) + Integer.valueOf(partes[4]) + Integer.valueOf(partes[5]) )/4; 
    System.out.println("promedio: "+promedio);        

}

Answered by AndyC on December 22, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP