我最近和一位同事讨论了为什么Java中的List接口(interface)没有head()
和tail()
方法。
为了实现这样的功能,必须编写一个看起来像这样的包装器:
public E head() {
if (underlyingList == null || underlyingList.isEmpty())
return null;
return underlyingList.get(0);
}
public E tail() {
if (underlyingList == null || underlyingList.isEmpty())
return null;
return underlyingList.get(underlyingList.size()-1);
}
我不了解所有 List 实现,但我认为至少在 LinkedList 和 ArrayList 中,获取最后一个和第一个元素(恒定时间)应该是非常简单的。
所以问题是:
为任何 List 实现提供 tail 方法不是一个好主意有什么具体原因吗?
最佳答案
List接口(interface)有subList
,几乎是head
和tail
。您可以将其包装如下
public List head(List list) {
return list.subList(0, 1);
}
public List tail(List list) {
return list.subList(1, list.size());
}
编辑
根据@Pablo Grisafi 的回答,这是一个 Java 快速排序实现——不是通用的,也不是高效的。正如预期的那样,head()
应该返回一个元素——而不是列表。
public class QSort {
public static List<Integer> qsort(List<Integer> list) {
if (list.isEmpty()) {
return list;
} else {
return merge(
qsort(lesser
(head(list), tail(list))),
head(list),
qsort(greater(
head(list), tail(list)))
);
}
}
private static Integer head(List<Integer> list) {
return list.get(0);
}
private static List<Integer> tail(List<Integer> list) {
return list.subList(1, list.size());
}
private static List<Integer> lesser(Integer p, List<Integer> list) {
return list.stream().filter(i -> i < p).collect(toList());
}
private static List<Integer> greater(Integer p, List<Integer> list) {
return list.stream().filter(i -> i >= p).collect(toList());
}
private static List<Integer> merge(List<Integer> lesser, Integer p, List<Integer> greater) {
ArrayList list = new ArrayList(lesser);
list.add(p);
list.addAll(greater);
return list;
}
public static void main(String[] args) {
System.out.println(qsort(asList(7, 1, 2, 3, -1, 8, 4, 5, 6)));
}
}
关于java - 为什么 List 中没有 tail() 或 head() 方法来获取最后一个或第一个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7568819/