Debido a que usted menciona la función cons
, asumiré que usted está acercando a este problema con el modelo conceptual de las listas enlazadas compuestas de células cons
. Específicamente, supongo que está pensando en cada lista que tiene un car
(el primer elemento) y un cdr
(la sublista que contiene todos los elementos siguientes).
Java admite listas enlazadas como java.util.LinkedList
. Estos son buenos para el recorrido lineal y pueden tener elementos insertados de manera muy eficiente. Estos son más similares a las listas vinculadas que mencioné anteriormente.
Java también ofrece java.util.ArrayList
. Las listas de este tipo son buenas para el acceso aleatorio, pero pueden ser lentas al insertar elementos. De hecho, son más lentos al insertar un elemento al principio de la lista. Debido a que ArrayList
s se implementan como arreglos entre bastidores, cada elemento debe copiarse una posición hacia adelante en la lista para dejar espacio para el nuevo primer elemento. Ahora, si también necesita una matriz más grande, ArrayList
asignará una nueva matriz, copiará todos los elementos, y así sucesivamente.
(de ImmutableList
Google se cita como "acceso aleatorio", por lo que es probable que más similar a este último.)
Si va a utilizar el método de cons
menudo, le recomiendo usar con listas enlazadas. Una operación cons
básicamente agrega un elemento al principio de una lista. Esto tiene poco sentido con estructuras lineales como arreglos. Recomiendo el uso de listas de matrices por este motivo: que están conceptualmente mal para el trabajo.
Para el muy exigente: porque una nueva lista se volvió cada vez cons
se llama, la copia debe ocurrir si la lista es una LinkedList
o un ArrayList
. Sin embargo, todo el principal de una operación cons
es que está operando en una lista vinculada.
public <E> LinkedList<E> cons(E car, List<E> cdr) {
LinkedList<E> destination = new LinkedList<E>(cdr);
destination.addFirst(car);
return destination;
}
Tenga en cuenta que el código anterior fue escrito después de leer las respuestas anteriores, por lo que me disculpo por cualquier plagio accidental. Avíseme si lo ve y lo reconoceré correctamente.
Suponiendo que estés satisfecho con el retorno de una LinkedList
, puede utilizar ImmutableList
como el cdr
en este ejemplo.
Para aquellos de nosotros que no están familiarizados con Lisp, lo que es contras? –
Definí el comportamiento y di un ejemplo. ¿Qué más quieres? –