java - 为什么 List 中没有 tail() 或 head() 方法来获取最后一个或第一个元素?

标签 java api list

我最近和一位同事讨论了为什么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,几乎是headtail。您可以将其包装如下

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/

相关文章:

java - 更新记录 if somcolumn! ="somevalue",使用 Hibernate saveorupdate()

python - 为什么这不会将 jira 转换为已解决?

ruby-on-rails - IAP 后端最佳实践

python - 如何以某种分辨率渲染用户给定的 Material 并访问渲染数据?

list - 如何刷新 ListView.builder flutter

python - 如何计算 Python 字符串中列表中每个项目的出现次数?

java - 如何解决java中的 Exception in thread "TimerQueue"Exception in thread "AWT-EventQueue-0"java.lang.IllegalMonitorStateException 之类的错误?

java - switch 语句不起作用 ("jumping around"很奇怪)

java - TestNg 在组中运行时跳过@BeforeSuite 和@BeforeClass

python - 如何从给定范围生成固定长度值的随机列表?