Рассчитать среднее в Java - PullRequest
       74

Рассчитать среднее в Java

4 голосов
/ 10 августа 2011

РЕДАКТИРОВАТЬ: я написал код для среднего, но я не знаю, как сделать так, чтобы он также использовал целые числа из моего args.length, а не массива

Мне нужно написать Java-программу, которая может вычислять: 1. количество прочитанных целых чисел в 2. среднее значение, которое не обязательно должно быть целым числом!

ВНИМАНИЕ! я не хочу вычислять среднее значение из массива, но целые числа в аргументах.

В настоящее время я написал это:

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

Кто-нибудь может направить меня в правильном направлении? Или приведите пример, который поможет мне в написании этого кода?

Заранее спасибо

Ответы [ 10 ]

6 голосов
/ 10 августа 2011

Подойдут небольшие изменения в вашем коде (с некоторыми изменениями в названии var):

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

Обратите внимание, что цикл также можно упростить:

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

Edit: OP, кажется, хочет использовать массив args. Похоже, это массив строк, поэтому он соответствующим образом обновил ответ.

Обновление :

Как правильно заметил zoxqoj, переполнение целых чисел / двойное не учтено в приведенном выше коде. Хотя я предполагаю, что входные значения будут достаточно малы, чтобы не иметь такой проблемы, вот фрагмент, который нужно использовать для действительно больших входных значений:

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

Этот подход имеет несколько преимуществ (хотя он и несколько медленнее, поэтому не используйте его для операций, критичных ко времени):

  • Точность сохраняется, с удвоением вы постепенно потеряете точность с количеством математических операций (или не получите точную точность вообще, в зависимости от чисел)
  • Вероятность переполнения практически исключена. Тем не менее, обратите внимание, что BigDecimal может быть больше, чем у double или long.
3 голосов
/ 10 августа 2011
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;
2 голосов
/ 10 августа 2011

Этот

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

в основном снова вычисляет args.length, просто неправильно (условие цикла должно быть i<args.length).Почему бы просто не использовать args.length (или nums.length) напрямую?

В противном случае ваш код выглядит нормально.Хотя, похоже, вы хотели прочитать ввод из командной строки, но не знаете, как преобразовать его в массив чисел - это ваша настоящая проблема?

0 голосов
/ 26 июня 2019

Это кажется старым потоком, но Java с тех пор развивалась и представила Streams & Lambdas в Java 8. Так что может помочь всем, кто хочет сделать это, используя функции Java 8.

  • В вашем случае вы хотите преобразовать аргументы, которые String [], в double или int.Вы можете сделать это, используя Arrays.stream(<arr>).Если у вас есть поток элементов массива String, вы можете использовать mapToDouble(s -> Double.parseDouble(s)), который преобразует поток Strings в поток двойников.
  • Затем вы можете использовать Stream.collect(supplier, accumulator, combiner) для вычисления среднего, если вы хотите сами управлять приращениями,Вот хороший пример .
  • Если вы не хотите постепенно увеличивать среднее, вы можете напрямую использовать Java Collectors.averagingDouble(), который напрямую вычисляет и возвращает среднее.некоторые примеры здесь .
0 голосов
/ 28 сентября 2017
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);
      }
   }
}
0 голосов
/ 29 августа 2015

Я собираюсь показать вам 2 способа.Если вам не нужно много статистики в вашем проекте, просто выполните следующее.

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

Если вы планируете делать много статистики, то можете и не изобретать велосипед.Так почему бы не проверить http://commons.apache.org/proper/commons-math/userguide/stat.html

Вы впадете в истинную любовь!

0 голосов
/ 10 августа 2011

Если вы пытаетесь получить целые числа из аргументов командной строки, вам понадобится что-то вроде этого:

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
}

Что касается фактического кода усреднения, другие предложили, как вы можете настроить это (поэтому я не буду повторять то, что они сказали).

Редактировать: на самом деле, вероятно, лучше просто поместить его в вышеуказанный цикл и вообще не использовать массив nums

0 голосов
/ 10 августа 2011

Вместо:

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

 }

Вы можете просто

int count = args.length;

Среднее значение - это сумма ваших аргументов, деленная на количество ваших аргументов.

int res = 0;
int count = args.lenght;

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

Вы также можете сделать этот код короче, я дам вам попробовать и спросить, нужна ли вам помощь!

Это мой первый ответ, скажите, если что-то не так!

0 голосов
/ 10 августа 2011

для 1. числа прочитанных целых чисел, вы можете просто использовать свойство length массива, например:

int count = args.length

, которое не содержит элементов массива.И 2. рассчитать среднее значение: вы делаете правильно.

0 голосов
/ 10 августа 2011
 System.out.println(result/count) 

вы не можете сделать это, потому что result / count не является типом String, а System.out.println () принимает только параметр String.возможно попробуйте:

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