Поскольку вы упоминаете функцию cons
, я предполагаю, что вы подходите к этой проблеме с концептуальной моделью связанных списков, состоящих из cons
ячеек. В частности, я предполагаю, что вы думаете о каждом списке, имеющем car
(первый элемент) и cdr
(подсписок, содержащий все следующие элементы).
Java поддерживает связанные списки как java.util.LinkedList
. Они хороши для линейного обхода и могут очень эффективно вставлять элементы. Они наиболее похожи на связанные списки, которые я упоминал выше.
Java также предлагает java.util.ArrayList
. Списки такого типа хороши для произвольного доступа, но могут быть медленными при вставке элементов. На самом деле они самые медленные при вставке элемента в начало списка. Поскольку ArrayList
реализованы как массивы за сценой, каждый элемент должен быть скопирован на одну позицию вперед в списке, чтобы освободить место для нового первого элемента. Теперь, если вам также понадобится больший массив, ArrayList
выделит новый массив, скопирует все элементы и т. Д.
(Google 1015 * упоминается как «произвольный доступ», так что, скорее всего, он больше похож на последний.)
Если вы планируете часто использовать свой метод cons
, я рекомендую использовать его со связанными списками. Операция cons
по существу добавляет элемент в начале списка. Это имеет мало смысла для линейных структур, таких как массивы. Я рекомендую не использовать списки массивов по этой причине: они концептуально не подходят для работы.
Для очень требовательных: поскольку новый список возвращается каждый раз, когда вызывается cons
, копирование должно выполняться независимо от того, является ли список LinkedList
или ArrayList
. Однако весь принцип операции cons
заключается в том, что она работает в связанном списке.
public <E> LinkedList<E> cons(E car, List<E> cdr) {
LinkedList<E> destination = new LinkedList<E>(cdr);
destination.addFirst(car);
return destination;
}
Обратите внимание, что приведенный выше код был написан после прочтения приведенных выше ответов, поэтому я прошу прощения за любой случайный плагиат. Дайте мне знать, если вы это увидите, и я правильно подтвердю.
Предполагая, что вы счастливы вернуть LinkedList
, вы можете использовать ImmutableList
в качестве cdr
в этом примере.