PDA

Ver la versión completa : Problema Programacion Java



danielv
20-02-2009, 17:26
Hola a todos.

Ante todo daros las gracias por la ayuda que me podais proporcionar.
Os comento mi problema:

Tengo que hacer una aplicacion en java que sea capaz de leer un archivo .txt con numeros separados por ";" tal que asi:

565;
485;
7846;
454;

Y de esos numeros saque la media y la desviacion estandar.

Ya he creado una aplicacion, pero esta me reporta 2 fallos al intentar compilarla, y ahi es donde necesito su ayuda.

Les adjunto mi código:

import java.io.*;
import java.util.ArrayList;
class Estad1
{

public static void main(String arg[ ]) throws IOException
{
ArrayList<Double> lista = new ArrayList<Double>();
try {
FileReader file = new
FileReader("read.txt");
BufferedReader buff = new
BufferedReader(file);
boolean eof = false;
while (!eof) {
String line = buff.readLine();
if (line == null) eof = true;
else{
line = line.split(";")[0];
lista.add(Double.parseDouble(line));
}
}
buff.close();
} catch (IOException e) {
System.out.println("Error -- " +e.toString());
}

Object numbers[] = lista.toArray();


System.out.println("\n Resultados \n");

double aux_media = media(numbers);
System.out.println(" media : " + aux_media);

double aux_var = varianza(numbers,aux_media);
System.out.println(" varianza : " + aux_var);
System.out.println(" desv. estandar : " + Math.sqrt(aux_var));
}


public static double media(int arr[ ])
{
double sum = 0.0;

for(int i = 0; i < arr.length ; i++)
{
sum += arr[i];
}

return sum / arr.length;
}

public static double varianza(int arr[ ], double media)
{
double sum = 0.0;

for(int i = 0; i < arr.length ; i++)
{
sum += Math.pow(arr[i] - media, 2);
}

return sum / (arr.length - 1);
}

}

Y el error que me reporta al intentar compilarlo es:

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
The method media(int[]) in the type Estad1 is not applicable for the arguments (Object[])
The method varianza(int[], double) in the type Estad1 is not applicable for the arguments (Object[], double)

at Estad1.main(Estad1.java:33)

Espero que puedan ayudarme. Muchas gracias a todos.

hystd
20-02-2009, 19:40
Buenas! Te da error porque las funciones "media" y "varianza" reciben un parámetro de tipo "int[]", que es un array de números, y lo que realmente le estás pasando es un array de tipo Objet (Object[]), el cual contiene referencias a objetos, que tu das por supuesto que van a ser de tipo "Double", pero esto Java no lo sabe...

Por tanto necesitas indicar que el array contiene Objetos (o referencias) y segundo asegurarte que esas referencias que contiene el array de Objetos, son objetos de tipo Double.

La forma de conseguir ésto (tal y como lo tienes planteado con un array de objetos), es usar las clases que encapsulan tipos de datos simples (en tu caso, la clase Double. Nota la mayúscula inicial de Double).

Por tanto el código corregido es el siguiente:

(He puesto en negrita los cambios, y en verde los comentarios)


import java.io.*;
import java.util.ArrayList;
class Estad1
{

public static void main(String arg[ ]) throws IOException
{
ArrayList<Double> lista = new ArrayList<Double>();
try {
FileReader file = new
FileReader("read.txt");
BufferedReader buff = new
BufferedReader(file);
boolean eof = false;
while (!eof) {
String line = buff.readLine();
if (line == null) eof = true;
else{
line = line.split(";")[0];

Double d = new Double(Double.parseDouble(line)); //Creas un objeto de tipo Double, que contiene el número indicado en el fichero "read.txt"
lista.add(d); //y lo añades a la lista

}
}
buff.close();
} catch (IOException e) {
System.out.println("Error -- " +e.toString());
}

Object numbers[] = lista.toArray();


System.out.println("\n Resultados \n");

double aux_media = media(numbers);
System.out.println(" media : " + aux_media);

double aux_var = varianza(numbers,aux_media);
System.out.println(" varianza : " + aux_var);
System.out.println(" desv. estandar : " + Math.sqrt(aux_var));
}


public static double media(Object arr[ ]) //Le pasas como argumento un array que contiene referencias a Objetos (y que ya estamos seguros que son Objetos de tipo Double.
{
double sum = 0.0;

for(int i = 0; i < arr.length ; i++)
{
sum += ((Double)arr[i]).doubleValue(); //Usas este método de la clase Double para obtener el valor encapsulado por el objeto de tipo Double. Para ello es necesario hacer un casting a (Double) ya que con esto indicas que un Objeto cualquiera va a ser tratado como un Double.
}

return sum / arr.length;
}

public static double varianza(Object arr[ ], double media) //Lo mismo con esta función
{
double sum = 0.0;

for(int i = 0; i < arr.length ; i++)
{
sum += Math.pow((((Double)arr[i]).doubleValue()) - media, 2); //idem
}

return sum / (arr.length); // array.length devuelve el número de elementos del array por lo que no es necesario restarle 1.
}

}

Un saludo.

danielv
20-02-2009, 21:00
Vaya. No me habia dado cuenta de esos detalles. Muchas gracias por tu rapida respuesta. De verdad que me has ayudado mucho. Estoy empezando a programar y todavia cometo fallos de estos. Espero que con algo más de tiempo y dedicación pues ser yo el que esté en este fabuloso foro ayudando a otras personas como tu me has ayudado hoy a mí.

Un saludo.

hystd
20-02-2009, 21:41
Nada, para eso estamos... ;).

Un saludo.