#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, но вам нужно создать свой собственный компаратор.