Вычисление среднего значения без самых высоких и самых низких значений в массиве

#java #arrays #average

#java #массивы #среднее

Вопрос:

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

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

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

Это то, что у меня есть до сих пор. Простите меня, если это несколько очевидно, но я в тупике и все еще нахожусь во введении к курсу Java.

Вот мой код на данный момент.

 double [] contestantOne = new double[8];

for (int index=0; index < contestantOne.length; index  ) {
    contestantOne [index] = (double) (Math.random()*9)   1;
}

for (int index=0; index < contestantOne.length; index  ) {
    System.out.println( contestantOne [index]   "n");
}

double contestantOneHigh; contestantOneHigh = contestantOne[0];

for (int index=1; index <contestantOne.length; index  ) {    
    if (contestantOne[index] > contestantOneHigh)
        contestantOneHigh = contestantOne[index];
}

System.out.print("The highest value in your array is" 
                 " "   contestantOneHigh);
System.out.println();
System.out.println();

double contestantOneLow; contestantOneLow = contestantOne[0];
for (int index=1; index<contestantOne.length; index  ) {   

    if (contestantOne [index] < contestantOneLow)
        contestantOneLow = contestantOne[index];
}    

System.out.print("The lowest value in your array is"
                 " "   contestantOneLow);
System.out.println();
System.out.println();
  

Комментарии:

1. Чтобы отформатировать свой код, вставьте его в редактор, выберите, если все, и используйте {} кнопку, чтобы превратить его в блок кода. И посмотрите на предварительный просмотр перед отправкой.

2. пожалуйста, не пишите так много syso println, напишите в своем одном syso » n n» для разрывов строк… И ваш цикл for не завершен (for (int index=1; index ….? )

3. Да, print/println s являются избыточными. Нет необходимости помещать пробел в качестве дополнительной строки. По крайней мере, вы должны сделать S.o.p. a println и иметь только один дополнительный пустой, лучше было бы, как говорит Martinl, добавить » n n» в конце, но лучше всего было бы сделать это printf s: S.o.pf("message %f%n%n", value); .

Ответ №1:

Вычислите сумму, как обычно, но сохраните переменную для каждого минимального и максимального значений, вычтя их в конце:

 double min, max, sum;
min = max = sum = list[0];  // May want to add a check to make sure length > 1
for(int i = 1; i < list.length; i  ) {
    double thisValue = list[i];
    sum  = thisValue;
    min = Math.min(min, thisValue);
    max = Math.max(max, thisValue);
}
sum -= min   max;
double avg = sum / (list.length - 2);
  

Конечно, вам может потребоваться настроить точные методы в соответствии с используемым классом.

Комментарии:

1. Почти то же самое с some List вместо array и Collections.min / Collections.max : ideone.com/4EJjr

Ответ №2:

Я не понимаю, почему вам нужно удалить высокое и низкое значение из массива, чтобы получить среднее? Среднее значение должно быть суммой всех значений, деленной на общее количество значений:

 double sum = 0;
for (int index=0; index < contestantOne.length; index  )
{
    //If you really need to remove highest and lowest value
    if (contestantOne[index] != contestantOneLow amp;amp; contestantOne[index] != contestantOneHigh)
        sum  = contestantOne[i];
}
double avg = sum / (double)(contestantOne.length - 2);
  

Проблема с удалением значений, как сделано выше, заключается в том, что максимумы и минимумы вашего массива не уникальны (array[10, 13, 15, 3, 15, 3, 6] 15 = Высокий, 3 = Низкий), тогда ваше среднее значение будет неверным при его вычислении, потому что оно будет игнорировать как 15, так и 3 секунды.

Я бы предложил сохранить индекс высокого и индекс низкого и использовать его вместо этого.

Комментарии:

1. Спасибо, у меня это сработало. Мне нужно было удалить самые высокие и самые низкие значения, потому что случайные удвоения являются «оценками судей» и предназначены для программы для определения победителя конкурса.

Ответ №3:

снова пройдитесь по массиву, проверяя, равен ли каждый элемент contestantOneLow / High , если он не добавляется к count, когда вы закончите, разделите это на contestantOne .длина — 2 или просто contestantOne.длина. это должно дать вам ваше среднее значение.

Ответ №4:

 Arrays.sort(a);
find sum of array a
sum -= a[0]   a[a.length - 1]
return sum / (a.length - 2)
  

Ответ №5:

если вы собираетесь вычислить среднее значение массива значений, и вы не знаете, будут ли в нем нули. Я использовал:

         int[] arrayDays = new int[] {monday,tuesday,wednesday,thursday,friday,saturday,sunday};
    int totalValue = 0;
    int divide = 0;

    for (int i=0;i<arrayDays.length;i  ){
        if (arrayDays[i] != 0){
            totalValue = totalValue   arrayDays[i];
            divide = divide 1;
        }
    }
    Float average = 0f;
    if (divide!=0){
        average = Float.valueOf(totalValue / divide);
    }
  

Ответ №6:

Почему бы вам не использовать набор деревьев вместо массива? Таким образом, элементы будут отсортированы, и вы сможете удалить более высокие и самые низкие элементы со сложностью O (1) вместо того, чтобы просматривать весь массив.

Вам нужно будет только просмотреть коллекцию, чтобы получить сумму, и это все. Вся ваша программа будет запущена за время O (logn) O (n).

 public static void main(String[] args) {
    TreeSet<Double> contestantOne = new TreeSet<>();

    for (int index=0; index < 8; index  ) {
        contestantOne.add((double) (Math.random()*9)   1);
    }

    Iterator<Double> iterator = contestantOne.iterator();
    while(iterator.hasNext()){
        System.out.println(iterator.next());
    }

    double contestantOneHigh = contestantOne.pollLast();

    System.out.print("The highest value in your array is" 
                     " "   contestantOneHigh);


    double contestantOneLow = contestantOne.pollFirst();

    System.out.println("The lowest value in your array is"
                     " "   contestantOneLow);

    double sum = 0.0;
    iterator = contestantOne.iterator();

    while(iterator.hasNext()){
        sum  = iterator.next();
    }

    System.out.println("The sum excluding first and last is: "   sum);
    System.out.println("The average excluding first and last is: "   sum/contestantOne.size());
}