2012-08-17 9 views
6

Tengo una tarea asignada y me preguntaba si alguien podría ayudarme ya que soy nuevo en Java y en programación y estoy atascado en una pregunta. La pregunta es:Cómo manipular matrices. Encuentra el promedio Principiante Java

El primer método encuentra la media de los elementos de una matriz de enteros:

public double average(int[] data) 

Es decir, dada una matriz de enteros, datos, calcular el promedio de sus elementos son devolver el valor promedio . Por ejemplo, el promedio de {1, 3, 2, 5, 8} es 3.8.

Aquí es lo que he hecho hasta ahora:

public double average(int[] data) { 
    int sum = 0; 

    while(int i=0; i < data.length; i++) 

    sum = sum + data[i]; 
    double average = sum/data.length;; 

    System.out.println("Average value of array element is " " + average); 
} 

Al compilar me sale un mensaje de error en la parte int i=0 diciendo '.class esperado'. Cualquier ayuda sería apreciada.

+0

U puede publicar toda la clase? –

+2

@DanglingPiyush No es necesario. La pregunta es clara. –

+2

Tu espacio en blanco es bastante engañoso. Por lo general, se considera una buena práctica usar aparatos ortopédicos para bucles for/while para mayor claridad, mientras que lo que tienes ahora es engañoso. Ver [este pastebin] (http://pastebin.com/HLpFv8zw) para ver un ejemplo de lo que quiero decir. –

Respuesta

4
-while(int i=0; i < data.length; i++) 
+for(int i=0; i < data.length; i++) 
+0

LOL. ¿Cómo puede nadie darse cuenta de esto? – RAY

+0

@RAY Es parte del formato de diferencia unificada http://en.wikipedia.org/wiki/Diff#Unified_format – CyberDem0n

+0

Lo sé. Es gracioso que nadie pareciera haber notado algo tan obvio. – RAY

13

El uso de un mejorado para sería aún mejor:

int sum = 0; 
for (int d : data) sum += d; 

Otra cosa que probablemente le dará una gran sorpresa es el mal resultado que va a obtener de

double average = sum/data.length; 

Razón : en el lado derecho tiene una división entera y Java no lo promocionará automáticamente a la división de coma flotante. Calculará el cociente entero de sum/data.length y solo entonces promoverá ese número entero a double. Una solución sería

double average = 1.0d * sum/data.length; 

Esto forzará el dividendo en un double, que se propagará automáticamente al divisor.

+1

Y uno puede arreglar el problema de la división entera asignando 'sum' como' doble' inicialmente; o lanzando explícitamente cualquiera de los argumentos en la línea divisoria, p. 'double average = ((double) sum)/data.length;' –

+1

@AndrzejDoyle No recomendaría 'double sum' como solución general, ya que conduciría a una pérdida de precisión para enteros superiores a 2^54 (¿o era 2?^56?). De todos modos, es un número bastante grande, pero aún así, ¿por qué hacerlo cuando hay una alternativa más limpia? –

+0

De acuerdo, convertir antes de la división es la forma "correcta" de hacerlo. (Creo que en su ejemplo quisiera agregar corchetes, para dejar en claro que se evalúa como '(1.0d * sum)/data.length' y no como' 1.0d * (sum/data.length) ', como esto último todavía está mal. Me doy cuenta de que incluso sin corchetes Java tomará el enfoque anterior, pero los corchetes son una especie de documentación que eliminará cualquier duda para alguien que esté leyendo. Un poco como marcar las variables 'finales' incluso si nunca son realmente reasignado.) –

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

or 

int i=0; 
while(i < data.length) 
{ 
    sum = sum + data[i]; 
    i++; 
} 
-1

par de problemas:

El while debe ser un for No están regresando un valor, pero que han declarado un tipo de retorno de doble

double average = sum/data.length;; 

suma y se data.length ambas entradas para que la división devuelva un int - compruebe sus tipos

doble punto y coma, probablemente no lo rompa, solo parece extraño.

0

probar este modo

public void average(int[] data) { 
    int sum = 0; 
    double average; 

    for(int i=0; i < data.length; i++){ 
     sum = sum + data[i]; 
    } 
    average = (double)sum/data.length; 
    System.out.println("Average value of array element is " + average);  
} 

si necesita devolver valor medio es necesario utilizar doble palabra clave en lugar de la palabra clave vacío y no necesita volver valor retorno promedio.

public double average(int[] data) { 
    int sum = 0; 
    double average; 

    for(int i=0; i < data.length; i++){ 
     sum = sum + data[i]; 
    } 
    average = (double)sum/data.length; 
    return average;  
} 
-1

¡Si queremos agregar números de una matriz y encontrar el promedio de ellos, seguimos de esta manera fácil! .....

public class Array { 

    public static void main(String[] args) { 

     int[]array = {1,3,5,7,9,6,3}; 
     int i=0; 
     int sum=0; 
     double average=0; 
     for(i=0;i<array.length;i++){ 
      System.out.println(array[i]); 
      sum=sum+array[i]; 
     } 
     System.out.println("sum is:"+sum); 
     System.out.println("average is: "+(double)sum/vargu.length); 



    } 

} 
+0

¿De dónde viene vargu? ¿Por qué declaras un promedio variable y no lo usas? ¿Por qué declaras la variable de iteración de bucle fori fuera del bucle? – skubski

0

mejor manera de encontrar el medio de algunos números está tratando Clases ......

public static void main(String[] args) { 
    average(1,2,5,4); 

} 

public static void average(int...numbers){ 
    int total = 0; 
    for(int x: numbers){ 
     total+=x; 
    } 
    System.out.println("Average is: "+(double)total/numbers.length); 

} 
0

Bueno, para calcular el promedio de una matriz, se puede considerar el uso de for bucle en lugar de while loop

Así como por su pregunta me dejó asumir una matriz como arrNumbers (aquí estoy teniendo en cuenta los mismos elementos de la matriz como en su pregunta)

int arrNumbers[] = new int[]{1, 3, 2, 5, 8}; 
int sum = 0; 

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

double average = sum/arrNumbers.length; 

System.out.println("Average is: " + average); 

Puede utilizar scanner clase también. Te queda a ti.

4

El Java 8 Streaming API ofrece una elegante alternativa:

public static void main(String[] args) { 
    double avg = Arrays.stream(new int[]{1,3,2,5,8}).average().getAsDouble(); 

    System.out.println("avg: " + avg); 
}