因为您提到了该cons
函数,所以我假设您正在使用由单元格组成的链表的概念模型来解决这个问题cons
。具体来说,我假设您正在考虑每个列表都有一个car
(第一个元素)和一个cdr
(包含所有后续元素的子列表)。
Java 支持链表作为java.util.LinkedList
. 这些对于线性遍历很有用,并且可以非常有效地插入元素。这些与我上面提到的链表最相似。
Java 还提供java.util.ArrayList
. 这种列表适合随机访问,但在插入元素时可能会很慢。事实上,在列表开头插入元素时,它们的速度最慢。因为ArrayList
s 在幕后实现为数组,所以每个元素都必须在列表中向前复制一个位置,以便为新的第一个元素腾出空间。现在,如果您还碰巧需要一个更大的数组,ArrayList
则将分配一个新数组,将所有元素复制过来,依此类推。
(谷歌ImmutableList
被称为“随机访问”,因此它可能更类似于后者。)
如果您打算cons
经常使用您的方法,我建议将它与链表一起使用。cons
操作本质上是在列表的开头添加一个元素。这对于诸如数组之类的线性结构几乎没有意义。出于这个原因,我建议不要使用数组列表:它们在概念上不适合这项工作。
对于非常挑剔的人:因为每次调用都会返回一个新列表,所以无论列表是 a还是 ancons
都必须进行复制。但是,操作的全部原理是它在链表上进行操作。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;
}
请注意,上述代码是在阅读上述答案后编写的,因此对于任何意外抄袭,我深表歉意。如果你看到它,请告诉我,我会正确承认。
假设您对返回 a 感到满意LinkedList
,您可以在本例中使用ImmutableList
as 。cdr