2016-09-08 2 views
-2

Я сделал простую программу, которая вычисляет среднее и среднее значение заданного массива из командной строки.Неожиданный результат при попытке рассчитать среднюю и среднюю

import java.util.Arrays; 

public class EdankJaya { 
    public static void main(String args[]) { 
     double sum = 0; 
     double d; 
     if(args.length < 1) { 
      System.out.println("Usage : java EdankJaya <Number1> <Number2> .."); 
      System.exit(1); 
     } 
     //Mean 
     for(String s : args) { 
      d = Double.parseDouble(s); 
      sum = sum+d; 
     } 
     double mean = sum/args.length; 
     System.out.println("Mean: " + mean); 
     //Median 
     Arrays.sort(args); 
     int med = args.length/2; 
     if((args.length % 2) == 0) { 
      double median1 = Double.parseDouble(args[med-1]); 
      double median2 = Double.parseDouble(args[med]); 
      System.out.println("Median :"+(median1+median2)/2); 
     } else { 
      double median = Double.parseDouble(args[med]); 
      System.out.println("Median :"+median); 
     } 
    } 
} 

Методика, что я используется для медианного значения является разделить на 2 args.length и хранить его в med. Если значение args.length равно, это будет args[med-1] + args[med], без проблем для четного номера. И при нечетном args.length значения, это будет просто args[med], который отлично работает на бумаге, так как целое не будет производить фракцию (11/2 будет 5), но вот что случилось:

enter image description here

Всё до тех пор, пока я не введет 1-10, значение вернется к результату при вводе 1-8 и 1-11 точно так же, как 1-7, и так далее. Что может быть проблемой здесь. Спасибо.

+4

Arrays.sort (args); сортирует строки, а не двойные значения, поэтому ваши «2, 3, 4 ...» появятся после «11, 12 ...». Всегда, действительно всегда, преобразуйте данные в форму, подходящую для алгоритма, и только затем запустите alorigthms ... –

+0

ах, так что 11 будет 1 + 1, 12 -> 1 + 2? –

+1

Нет, это не так. Строки сортируются по подстрокам, требуемым для принятия решения, то есть сравнивая «1» и «2», «1» будет выглядеть до «2» по понятным причинам, сравнивая «11» и «2» java будет сравнивать подстроки 1 char первым и увидит, что «1» - до «2», чего будет достаточно; сравнивая «21» и «2», сравнение первых символов даст равенство, поэтому следующий будет рассмотрен, а затем до Java будет принято решение о том, что «» предшествует «1» или нет ... –

ответ

1

В вашем массиве есть строки, а не цифры, поэтому они не сортируются в порядке чисел. Вероятно, они сортируются в порядке ASCII. Поскольку вы уже итерации по массиву и преобразования их в числа, построить второй массив с ними и сортировать их.