Перебор по списку и вычитание предыдущих элементов дает нежелательные результаты - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь создать программу чтения MIDI на Java.Цель состоит в том, чтобы сохранить заметки из MIDI-файла и временные подписи нот, используя отметки каждой ноты и вычитая их, чтобы найти разницу значений, а затем преобразовать их в соответствующие значения времени.

Пример вывода моей программы:

Tick at @27576
Channel: 2 
Note = AS1 key = 34
Tick at @27600
Channel: 2 
Note = AS1 key = 34
Tick at @27624
Channel: 2 
Note = AS1 key = 34
Tick at @29952
//and so on

Затем значения тиков будут вставлены в ArrayList с именем noteTimings, а значения заметок будут вставлены вArrayList с именем noteKeyValues

Итак, в примере вывода - noteTimings будет иметь значения: [27576, 27600, 27624, 29952]

Теперь, что я пытаюсьexecute выполняет вычитание последнего элемента с предыдущим (например, 29952 - 27624) и вставку этого значения в новый ArrayList.Это будет продолжаться до тех пор, пока каждый элемент не будет повторен в цикле for.

Мой цикл for:

ArrayList<Integer> newNoteTimings = new ArrayList<>();
for (int i = noteTimings.size() - 1; i >= 1; i--) {
        for (int j = i - 1; j >= 0; j--) {
            newNoteTimings.add((noteTimings.get(i) - noteTimings.get(j)));
        }
    }

System.out.println(newNoteTimings);

Ожидаемые результаты:

2328
24
24

Фактические результаты:

2328
2352
2376

Есть что-то, что я пропускаю?Любая помощь будет оценена!

1 Ответ

0 голосов
/ 05 февраля 2019

Вы можете перевернуть список и выполнить вычитание с начала, например:

List<Integer> list = new ArrayList<>();
list.add(27576);
list.add(27600);
list.add(27624);
list.add(29952);

//Reverse the list
Collections.reverse(list);
List<Integer> result = new ArrayList<>();
for(int i=0 ; i<list.size() - 1 ; i++) {
    result.add(list.get(i) - list.get(i+1));
}
System.out.println(result);
...