Печать отсортированных (по возрастанию) плавающих данных с включением каждого индекса

#java #arrays #sorting

#java #массивы #сортировка

Вопрос:

Существует множество подходов к определению местоположения пиков. Рассмотрим массив данных x[]. Для нашего проекта мы определяем пик как элемент массива, который является локальным максимумом, превышающим каждый из его соседей в 2 или более раз. Первый и последний элементы в массиве имеют только по одному соседнему элементу каждый и по определению не могут быть вершинами. Следовательно, учитывая этот массив x[] с 20 элементами:

0.20 0.50 0.10 0.15 0.20 0.13 0.30 0.25 0.30 0.30 ( элементы 0-9)

0.70 0.20 0.45 0.15 0.20 0.85 0.30 0.65 0.20 0.10 ( элементы 10-19)

Максимумы находятся при x [1] = 0,5, x [10] = 0,7, x [12] = 0,45, x [15] = 0,85, x [17] = 0,65.

Для этого проекта вы напишете программу, которая сканирует массив данных, находит пики на основе критерия, определенного выше, и (за дополнительную плату) сортирует их в порядке возрастания. Вот что должна делать ваша программа:

Объявите и инициализируйте массив x[] из 20 плавающих данных.

float [] x = {0.2f, 0.5f, 0.1f, 0.15f, 0.2f, 0.13f, 0.3f, 0.25f, 0.3f, 0.3f, 0.7f, 0.2f, 0.45f, 0.15f, 0.2f, 0.85f, 0.3f, 0.65f, 0.2f, 0.1f};

Выведите элементы x[], по 10 в каждой строке, с точностью до 2 знаков после запятой.

Найдите пики в x[] и сохраните их индексы в массиве с именем peaks[].

Выведите индекс и данные для каждого пика в том порядке, в котором они отображаются в x[].

Пока мой код выглядит следующим образом:

     float[] x = {0.2f, 0.5f, 0.1f,  0.15f, 0.2f, 0.13f, 0.3f, 0.25f, 0.3f, 0.3f,
                 0.7f, 0.2f, 0.45f, 0.15f, 0.2f, 0.85f, 0.3f, 0.65f, 0.2f, 0.1f};

    int numPeaks = 0;   // Amount of peaks found.
    int[] peaks = new int[x.length];

    System.out.println("Data array:");  // Print header.

    // Print out data.
    for (int i = 0; i < x.length; i  ) {
        System.out.printf("%.2f ", x[i]);
        if (i == (x.length - 1) / 2) {
            System.out.println();
        }
    }
    System.out.println("n");   // Double line break.

    // Search for peaks and stores them into peaks[i].
    // Also counts how many peaks there are.
    for (int i = 1; i < x.length - 1; i  ) {
        if (x[i] > (x[i-1] * 2) amp;amp; x[i] > (x[i 1] * 2)) {
            numPeaks  ;
            peaks[i] = i;
        }
    }
    // Print number of peaks found.
    System.out.println(numPeaks   " peaks found:");

    // Print only the peaks found along with their indices.
    for (int i = 1; i < x.length - 1; i  ) {
        if (x[i] > (x[i-1] * 2) amp;amp; x[i] > (x[i 1] * 2)) {
            System.out.printf("-", peaks[i]);
            System.out.println(" "   x[i]);
        }
    }
  

и вывод:

 Data array:
0.20 0.50 0.10 0.15 0.20 0.13 0.30 0.25 0.30 0.30 
0.70 0.20 0.45 0.15 0.20 0.85 0.30 0.65 0.20 0.10 

5 peaks found:
 1 0.5
10 0.7
12 0.45
15 0.85
17 0.65
  

и я хочу, чтобы результат выглядел следующим образом:

 Data array:
0.20 0.50 0.10 0.15 0.20 0.13 0.30 0.25 0.30 0.30
0.70 0.20 0.45 0.15 0.20 0.85 0.30 0.65 0.20 0.10

5 peaks found:
 1 0.5
10 0.7
12 0.45
15 0.85
17 0.65

Sorted peaks:
12 0.45
 1 0.5
17 0.65
10 0.7
15 0.85
17 0.65
  

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

Если мне не хватает какой-либо информации, пожалуйста, просто спросите

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

1. Хотя технически вопросы домашнего задания соответствуют теме Stack Overflow, они очень неодобрительны .

Ответ №1:

Решение здесь заключается в сортировке вашего peaks массива с использованием сравнения, которое сравнивает значения в исходных данных.

Если вы используете Java 8, вы могли бы Integer создавать объекты вместо int , а затем использовать компаратор:

 Integer[] peaks;
Arrays.sort(peaks, Comparator.comparing(i -> x[i]));
  

Вы можете сделать то же самое в Java 7, но вам нужно создать свой собственный компаратор.