Я хорошо осведомлен о стоимости итерации LinkedList
с внешним индексом (for
). Заглядывая в исходный код для ListIterator
, возвращаемый LinkedList#listIterator
, я замечаю, что он значительно ускоряет процесс, отслеживая узел, который он использует в настоящее время.Преобразование LinkedList в ArrayList для более быстрого параллельного итерации
Тем не менее, я недавно натолкнулся на this question, что в основном касалось итерации по двум или более спискам одновременно, но это необходимо для отслеживания индекса для передачи значений в массив. На мой взгляд, это сделало использование итераторов немного избыточным и более подверженным человеческой ошибке, поскольку индивидуальные декларации были необходимы для каждого итератора, поверх цикла и вызова каждого метода next
. Вот почему я попытался избежать компиляции iterator-loop. Вот возможное решение проблемы:
List<Integer> listOne = new ArrayList<>();
List<Integer> listTwo = new ArrayList<>();
int[] combined = new int[(listOne.size() < listTwo.size() ? listOne.size() : listTwo.size())];
for (int i = 0; i < combined.length; i++) {
combined[i] = listOne.get(i) + listTwo.get(i);
}
Это хорошо для ArrayList
, но это будет довольно медленная работа с LinkedList
.
Одним из возможных решений было бы использовать конструктор преобразования ArrayList
, чтобы получить все ссылки из LinkedList
:
//convert linkedlists to arraylists
ArrayList<Integer> arrayListOne = new ArrayList<>(listOne);
ArrayList<Integer> arrayListTwo = new ArrayList<>(listTwo);
//iterate with an efficient get() operation
for (int i = 0; i < combined.length; i++) {
combined[i] = listOne.get(i) + listTwo.get(i);
}
Так как это будет вызывать только итератор каждого LinkedList
один раз, а затем использовать более эффективный ArrayList#get
метод, это жизнеспособное решение? Не повлияют ли накладные расходы на конверсию эффективности? Есть ли другие недостатки этого метода?
@MouseEvent, следовательно, проверка размера на 'объединенные';) – MikaelF