EDIT: He escrito el código para la media, pero no sé cómo hacer para que también se utilizan enteros de mis argumentos.de longitud en lugar de la matriz

Necesito escribir un programa java que se puede calcular: 1. el número de enteros leer en 2. el valor promedio—que no tiene por qué ser un número entero!

NOTA! no quiero calcular el promedio de la matriz, pero los números enteros en la args.

Actualmente he escrito esta:

int count = 0;
    for (int i = 0; i<args.length -1; ++i)
        count++;
    System.out.println(count);

     }

int nums[] = new int[] { 23, 1, 5, 78, 22, 4};
double result = 0; //average will have decimal point
    {
    for(int i=0; i < nums.length; i++){
    result += nums[i];
    }
    System.out.println(result/count)
 }

¿Alguien puede guiarme en la dirección correcta? O dar un ejemplo que me guía en la escritura de manera de dar forma a este código?

Gracias de antemano

  • args.longitud ya contiene su count, no hay necesidad para el primer bucle for. ¿Cuál es tu pregunta? Estás preguntando por mejoras? ¿El código de trabajo? ¿Quieres saber cómo transformar args[] a un int-matriz?
  • int count = args.length; para obtener el número de argumentos ..
  • Es estos dos códigos relacionados o no ? Porque en el 2º bucle for que usted está utilizando el conteo.
  • Relacionados: stackoverflow.com/questions/6993060/…
  • Lo siento, no era claro, He escrito el código para la media, pero no sé cómo hacer para que también se utilizan enteros de mis argumentos.de longitud en lugar de la matriz
InformationsquelleAutor syncoroll | 2011-08-10

10 Comentarios

  1. 6

    Sólo algunas pequeñas modificaciones a su código va a hacer (con el cambio de nombre de algunos de var para mayor claridad) :

    double sum = 0; //average will have decimal point
    
    for(int i=0; i < args.length; i++){
       //parse string to double, note that this might fail if you encounter a non-numeric string
       //Note that we could also do Integer.valueOf( args[i] ) but this is more flexible
       sum += Double.valueOf( args[i] ); 
    }
    
    double average = sum/args.length;
    
    System.out.println(average );

    Tenga en cuenta que el bucle también puede ser simplificada:

    for(String arg : args){
       sum += Double.valueOf( arg );
    }

    Edit: el OP parece querer utilizar el args matriz. Esto parece ser una matriz de cadenas, lo que actualiza la respuesta en consecuencia.

    Actualización:

    Como zoxqoj señalado correctamente, entero/doble desbordamiento no es atendido en el código anterior. Aunque asumo los valores de entrada va a ser lo suficientemente pequeño como para no tener ese problema, he aquí un fragmento de uso para grandes valores de entrada:

    BigDecimal sum = BigDecimal.ZERO;
    for(String arg : args){
      sum = sum.add( new BigDecimal( arg ) );
    }

    Este enfoque tiene varias ventajas (a pesar de ser un poco más lento, así que no lo use para el tiempo de las operaciones críticas):

    • Precisión se mantiene, con el doble que poco a poco se suelta con precisión el número de operaciones matemáticas (o no obtener exacta precisión, en función de los números)
    • La probabilidad de desbordamiento está prácticamente eliminado. Tenga en cuenta sin embargo, que un BigDecimal podría ser más grande que lo que se ajusta a un double o long.
    • Si yo fuera a utilizar argumentos.longitudes en lugar de nums.la longitud de lo que iba a hacer a la «suma += nums[i];» ?
    • Releyendo tu actualizada pregunta también he actualizado mi respuesta.
    • desbordamiento de enteros en que no se toma el cuidado de
    • Eso es cierto, pero dudo que este sea un problema aquí y prefiero que me gusta mantener el ejemplo sencillo. Voy a añadir otro ejemplo, sin embargo.
    • Usted debe comprobar si 0 == args.longitud, si usted no hace esto, entonces usted consigue «división por cero» en la línea del doble del promedio = suma/args.longitud; cuando args.la longitud es 0.
    • tienes razón, y probablemente todavía hay un par de errores más que puede ocurrir, pero por razones de simplicidad y en el caso de la OP aquellos que están en el tintero y a la izquierda para el implementador de manejar.
    • suma += Doble.valueOf( argumentos ); debería ser de suma += Doble.valueOf( arg );
    • tienes razón, me fijo en ambos fragmentos.

  2. 3
    int values[] = { 23, 1, 5, 78, 22, 4};
    
    int sum = 0;
    for (int i = 0; i < values.length; i++)
        sum += values[i];
    
    double average = ((double) sum) / values.length;
  3. 2

    Este

    for (int i = 0; i<args.length -1; ++i)
        count++;

    básicamente calcula args.length de nuevo, sólo incorrectamente (condición de bucle debe ser i<args.length). Por qué no usar simplemente args.length (o nums.length) directamente en su lugar?

    De lo contrario, el código parece OK. Aunque parece como si usted quisiera leer la entrada desde la línea de comandos, pero no saben cómo convertirlo en un array de números – es este el problema?

  4. 0
     System.out.println(result/count) 

    usted no puede hacer esto porque el resultado/el conde no es un tipo de Cadena, y el Sistema.a cabo.println() sólo toma un parámetro de Cadena. tal vez probar:

    double avg = (double)result / (double)args.length
  5. 0

    para 1. el número de enteros leer, sólo puede utilizar la propiedad length del array como :

    int count = args.length

    que no le da a usted de elementos en una matriz.
    Y 2. para calcular el valor promedio :
    ustedes están haciendo en forma correcta.

  6. 0

    Lugar de:

    int count = 0;
    for (int i = 0; i<args.length -1; ++i)
        count++;
    System.out.println(count);
    
     }

    sólo puede

    int count = args.length;

    El promedio es la suma de sus argumentos, dividido por el número de sus argumentos.

    int res = 0;
    int count = args.lenght;
    
    for (int a : args)
    {
    res += a;
    }
    res /= count;

    puede que este código sea más corta demasiado, voy a dejar que usted trate y pregunte si usted necesita ayuda!

    Este es mi primer answerso decirme si hay algo mal!

    • Tengo un error para el uso de argumentos. «La excepción en el thread «main» java.lang.Error: no Resueltos problema de compilación: no coincide el Tipo: no se puede convertir de un tipo de elemento de String a int»
    • Tenga en cuenta que res /= count va a hacer la división entera y así la mayoría de producir un resultado erróneo (el OP de los estados que la media puede contener puntos decimales).
    • No nos dicen lo que args en realidad es, por lo tanto, puede ser asumido que es int[] args. Lo más probable es que String[] args (es un main método, ¿verdad?) – pues tendrías que cambiar el bucle for para for( String a : args) y llame a res += Integer.parseInt( a) en el interior.
    • Usted sabe, yo no código de prueba para su tarea! Esto es sólo una manera de hacerlo, un algoritmo.. se debe trabajar, depende del tipo de su vars..
  7. 0

    Si usted está tratando de llegar a los enteros desde la línea de comandos args, tendrás algo como esto:

    public static void main(String[] args) {
        int[] nums = new int[args.length];
        for(int i = 0; i < args.length; i++) {
            try {
                nums[i] = Integer.parseInt(args[i]);
            }
            catch(NumberFormatException nfe) {
                System.err.println("Invalid argument");
            }
        }
    
        //averaging code here
    }

    Como para el promedio de código, otros han sugerido cómo se puede ajustar de que (por lo que no voy a repetir lo que he dicho).

    Edit: en realidad es probable que sea mejor, simplemente colócalo dentro de la anterior bucle y no utilizar el nums matriz en todos los

  8. 0

    Voy a mostrar 2 formas. Si usted no necesita una gran cantidad de estadísticas en su proyecto basta con poner en práctica siguiente.

    public double average(ArrayList<Double> x) {
        double sum = 0;
        for (double aX : x) sum += aX;
        return (sum / x.size());
    }

    Si usted planea en hacer un montón de estadísticas bien podría no reinventar la rueda. Así que ¿por qué no echa un vistazo a http://commons.apache.org/proper/commons-math/userguide/stat.html

    Te vas a caer en cierto luv!

  9. 0
    public class MainTwo{
        public static void main(String[] arguments) {
            double[] Average = new double[5];
            Average[0] = 4;
            Average[1] = 5;
            Average[2] = 2;
            Average[3] = 4;
            Average[4] = 5;
            double sum = 0;
            if (Average.length > 0) {
                for (int x = 0; x < Average.length; x++) {
                    sum+=Average[x];
                    System.out.println(Average[x]);
                }
                System.out.println("Sum is " + sum);
                System.out.println("Average is " + sum/Average.length);
          }
       }
    }
  10. 0

    Parece pasado de rosca, pero Java ha evolucionado desde entonces & introdujo los Arroyos & Lambdas en Java 8. Por lo tanto, puede ayudar a todo el que desee hacer uso de Java 8 características.

    • En su caso, usted quiere convertir args que es String[] en el doble
      o int. Usted puede hacer esto utilizando Arrays.stream(<arr>). Una vez que haya flujo de la Cadena de elementos de la matriz, puede utilizar mapToDouble(s -> Double.parseDouble(s)) que se va a convertir secuencia de Cadenas en una corriente de dobles.
    • A continuación, puede utilizar Stream.collect(supplier, accumulator, combiner) para calcular el promedio, si quieres controlar incremental cálculo de los mismos. Aquí es algunos buen ejemplo.
    • Si usted no quiere hacer de forma incremental promedio, se puede utilizar directamente Java Collectors.averagingDouble() que directamente se calcula y devuelve la media. algunos los ejemplos aquí.

Dejar respuesta

Please enter your comment!
Please enter your name here